hdu 1269(tarjan)
阿新 • • 發佈:2017-09-12
void push cnblogs scan stack truct i++ ade string
就是板子,這次沒看板子,自己寫的
#include <iostream> #include <cstdio> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <stack> #include <set> using namespace std; #define hh printf("--------------\n"); constint maxn=10000+100; const int maxm=100000+100; int low[maxn],dfn[maxn]; int ncnt,ccnt; int noc[maxn]; int hade[maxn]; bool vis[maxn],insk[maxn]; stack<int> sk; struct note { int to; int next; }aa[maxm]; int n,m,k; void addage(int fr,int to) { aa[k].to=to; aa[k].next=hade[fr]; hade[fr]=k++; }void tarjan(int u) { ncnt++; low[u]=ncnt; dfn[u]=ncnt; sk.push(u); vis[u]=1; insk[u]=1; for(int i=hade[u];i!=-1;i=aa[i].next) { int v=aa[i].to; if(!vis[v]) { tarjan(v); low[u]=min(low[u],low[v]); }else if(insk[v]) { low[u]=min(low[u],dfn[v]); } } if(low[u]==dfn[u]) { int v; do { v=sk.top(); sk.pop(); insk[v]=1; noc[v]=ccnt; } while(v!=u); ccnt++; } } void init() { k=0; memset(hade,-1,sizeof(hade)); memset(vis,0,sizeof(vis)); memset(insk,0,sizeof(insk)); while(sk.size()) sk.pop(); ncnt=0; ccnt=0; } int main() { while(~scanf("%d%d",&n,&m)&&(m+n)) { init(); int a,b; for(int i=1;i<=m;i++) { scanf("%d%d",&a,&b); addage(a,b); } for(int i=1;i<=n;i++) if(!vis[i]) tarjan(i); if(ccnt==1) printf("Yes\n"); else printf("No\n"); } return 0; }
hdu 1269(tarjan)