1 条题解
-
0
思路
第一问是缩点DAG源数,第二问多SCC时为max(源数,汇数),已单SCC时0;不要漏掉名单0分隔或将两问输出合并成单个计数。
参考程序(C++11)
#include <bits/stdc++.h> using namespace std; vector<int>components(const vector<vector<int>>&g,const vector<vector<int>>&rev,int &count){int n=g.size();vector<int>seen(n),order,next(n);for(int s=0;s<n;s++)if(!seen[s]){vector<int>st(1,s);seen[s]=1;while(!st.empty()){int u=st.back();if(next[u]<(int)g[u].size()){int v=g[u][next[u]++];if(!seen[v]){seen[v]=1;st.push_back(v);}}else{order.push_back(u);st.pop_back();}}}vector<int>c(n,-1);count=0;for(auto it=order.rbegin();it!=order.rend();++it)if(c[*it]<0){vector<int>st(1,*it);c[*it]=count;while(!st.empty()){int u=st.back();st.pop_back();for(int v:rev[u])if(c[v]<0){c[v]=count;st.push_back(v);}}count++;}return c;} int main(){ios::sync_with_stdio(false);cin.tie(nullptr);int n;cin>>n;vector<vector<int>>g(n),rev(n);for(int u=0;u<n;u++){int v;while(cin>>v&&v){--v;g[u].push_back(v);rev[v].push_back(u);}}int count;auto c=components(g,rev,count);vector<int>in(count),out(count);for(int u=0;u<n;u++)for(int v:g[u])if(c[u]!=c[v]){in[c[v]]=1;out[c[u]]=1;}int a=0,b=0;for(int i=0;i<count;i++){a+=!in[i];b+=!out[i];}cout<<a<<'\n'<<(count==1?0:max(a,b))<<'\n';}
- 1