HOJ http://acm.hdu.edu.cn/showproblem.php?pid=1269 //版本2 邻接表建图 tarjan 与上面的风格也不一样,参考的是吉林大学的代码库 #include<stdio.h> #include<string.h> #include<vector> #include<iostream> #define V 10001 using namespace std; vector<int>vec[V]; int id[V],pre[V],low[V],s[V],stop,cnt,scnt; void tarjan(int v,int n) { int t,minc = low[v] = pre[v] = cnt++;//pre[v]表示搜索的次序,low[v]表示为u或u的子树能够追溯到节点的次序号 vector<int>::iterator pv; s[stop++] = v; for(pv = vec[v].begin(); pv != vec[v].end(); ++pv) { if(-1==pre[*pv])//如果当前节点未访问 tarjan(*pv,n); if(low[*pv] < minc) //如果下一个节点的low值比当前节点的Low值小,则更新 minc = low[*pv]; } if(minc<low[v]) { low[v] = minc; return ; } do { id[ t = s[--stop] ] = scnt; low[t] = n; }while( t!=v ); ++scnt; } int main() { // freopen("in.txt","r",stdin); int n,m; int a,b; int i; while(scanf("%d %d",&n,&m),n+m) { for( i=0; i<V; i++) vec[i].clear(); memset(pre,-1,sizeof(-1)); while(m--) { scanf("%d %d",&a,&b); vec[a-1].push_back(b-1); } scnt = stop = 0; cnt = 0; memset(low,-1,sizeof(low)); memset(pre,-1,sizeof(pre)); for( i=0; i<n; ++i) { if(pre[i]==-1) tarjan(0,n); } if(scnt==1) printf("Yes/n"); else printf("No/n"); } return 0; }