1. 程式人生 > >hdu 1269(tarjan)

hdu 1269(tarjan)

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");
const
int 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)