hdu 1269 强连通图 tarjian算法 计算环有多少个
代码不能粘贴复制,只有充分理解之后自己亲手敲的才是真正理解了,
即使是参考他人的也有收获
理解了tarjian算法让自己对算法有了好感,感觉算法真的好强,解决看起来不能解决的问题,
那是一种超越
#include <iostream> #include <cstdio> #include <vector> #include <stack> #include <algorithm> using namespace std; #define MAXVER 10010 vector<int> g[MAXVER]; stack<int> st; int visit[MAXVER]; int instack[MAXVER]; int dfn[MAXVER],low[MAXVER]; int n,m,index,num; void tarjian(int u) { int i,v; dfn[u]=low[u]=index++; st.push(u); instack[u]=1; visit[u]=1; for(i=0;i<g[u].size();i++) { v=g[u][i]; if(!visit[v]) { tarjian(v); low[u]=low[u]<low[v]?low[u]:low[v]; }else if(instack[v]) { low[u]=low[u]<dfn[v]?low[u]:dfn[v]; } } if(dfn[u]==low[u]) { do { v=st.top(); instack[v]=0; st.pop(); }while(u!=v); num++; } if(num>=2) return; } int main() { int start,end,i; while(scanf("%d%d",&n,&m),n+m) { for(i=0;i<=n;i++) g[i].clear(); for(i=0;i<m;i++) { scanf("%d%d",&start,&end); g[start].push_back(end); } memset(visit,0,sizeof(visit)); memset(instack,0,sizeof(instack)); index=0; num=0; for(i=1;i<=n;i++) { if(!visit[i]) tarjian(i); if(num>=2) break; } if(num==1) printf("Yes\n"); else printf("No\n"); } return 0; }