标签:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<vector> 5 #include<cstring> 6 using namespace std; 7 const int mxn=20000; 8 int top,stack[mxn];//栈 9 bool inst[mxn];//在栈内标志 10 int cnt,dnow;//强连通个数,当前时间 11 int dfn[mxn],low[mxn]; 12 vector<int> e[mxn];//邻接矩阵 13 void clear(){ 14 cnt=0;dnow=0;top=0; 15 memset(dfn,-1,sizeof(dfn)); 16 memset(inst,false,sizeof(inst)); 17 for(int i=1;i<mxn;i++) e[i].clear(); 18 } 19 int n,m; 20 void tarjan(int s){//tarjan算法,s为源点 21 int v=0,i; 22 dfn[s]=++dnow; 23 low[s]=dnow; 24 inst[s]=1; 25 stack[++top]=s; 26 for(i=0;i<e[s].size();i++){ 27 v=e[s][i];//到达点 28 if(dfn[v]==-1){ 29 tarjan(v); 30 low[s]=min(low[v],low[s]); 31 } 32 else if(inst[v]){ 33 low[s]=min(dfn[v],low[s]); 34 } 35 } 36 if(dfn[s]==low[s]){ 37 cnt++; 38 do{ 39 v=stack[top--]; 40 inst[v]=false; 41 }while(v!=s); 42 } 43 return; 44 } 45 int main(){ 46 while(scanf("%d%d",&n,&m) && n && m ){ 47 clear(); 48 int i,j; 49 int u,v; 50 for(i=1;i<=m;i++){ 51 scanf("%d%d",&u,&v); 52 e[u].push_back(v); 53 } 54 for(i=1;i<=n;i++){ 55 if(dfn[i]==-1)tarjan(i); 56 } 57 if(cnt==1)printf("Yes\n"); 58 else printf("No\n"); 59 } 60 return 0; 61 }
WA中,存个代码
标签:
原文地址:http://www.cnblogs.com/SilverNebula/p/5554069.html