第一道强联通的题目纪念一下! 主要是模版 tarjan算法
#include <iostream> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <stack> #include <cstring> using namespace std; #define INF 0xfffffff #define maxn 10005 #define min(a,b) (a<b?a:b) int n, m, time; vector<int> G[maxn]; stack<int> S; bool inStack[maxn]; int low[maxn], dfn[maxn]; void tarjan(int u) { int i, len = G[u].size(), v; low[u] = dfn[u] = time ++; inStack[u] = true; S.push(u); for(i=0; i<len; i++) { int v = G[u][i]; if( !low[v] ) { tarjan(v); low[u] = min(low[u], low[v]); } else if(inStack[v]) { low[u] = min(low[u], dfn[v]); } } do { v = S.top(); S.pop(); inStack[v] = false; }while(u != v); } void init() { int i; memset(low, 0, sizeof(low)); time = 1; for(i=1; i<=n; i++) G[i].clear(); } bool canSolve() { int i; for(i=1; i<=n; i++) { if(low[i] != 1) return false; } return true; } int main() { int i; while(scanf("%d%d",&n,&m), m+n ) { int a, b; init(); for(i=0; i<m; i++) { scanf("%d%d",&a,&b); G[a].push_back(b); } tarjan(1); if( canSolve() ) printf("Yes "); else printf("No "); } return 0; }