就是统计入度为0 的点 和 出度为0 的点 输出 大的那一个,,
若图中只有一个强连通分量 则输出0即可
和https://www.cnblogs.com/WTSRUVF/p/9301096.html 这题差不多 poj1236
#include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <cmath> #define rap(a, n) for(int i=a; i<=n; i++) #define MOD 2018 #define LL long long #define ULL unsigned long long #define Pair pair<int, int> #define mem(a, b) memset(a, b, sizeof(a)) #define _ ios_base::sync_with_stdio(0),cin.tie(0) //freopen("1.txt", "r", stdin); using namespace std; const int maxn = 20005, INF = 0x7fffffff; vector<int> G[maxn]; int pre[maxn], lowlink[maxn], sccno[maxn], dfs_clock, scc_cnt, in[maxn], out[maxn]; stack<int> s; void dfs(int u) { pre[u] = lowlink[u] = ++dfs_clock; s.push(u); for(int i=0; i<G[u].size(); i++) { int v = G[u][i]; if(!pre[v]) { dfs(v); lowlink[u] = min(lowlink[u], lowlink[v]); } else if(!sccno[v]) lowlink[u] = min(lowlink[u], pre[v]); } if(lowlink[u] == pre[u]) { scc_cnt++; for(;;) { int x = s.top(); s.pop(); sccno[x] = scc_cnt; if(x == u) break; } } } void init() { dfs_clock = scc_cnt = 0; mem(sccno, 0); mem(pre, 0); mem(out, 0); mem(in, 0); for(int i=0; i<maxn; i++) G[i].clear(); } int main() { int T, n, m; scanf("%d", &T); while(T--) { init(); scanf("%d%d", &n, &m); rap(1, m) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); // G[v].push_back(u); } rap(1, n) if(!pre[i]) dfs(i); rap(1, n) { for(int j=0; j<G[i].size(); j++) { if(sccno[i] != sccno[G[i][j]]) out[sccno[i]]++, in[sccno[G[i][j]]]++; } } if(scc_cnt == 1) { cout<< '0' <<endl; continue; } int a = 0, b = 0; rap(1, scc_cnt) { if(!in[i]) a++; if(!out[i]) b++; } cout<< max(a, b) <<endl; } return 0; }