标签:
3 3 1 2 2 3 3 1 3 3 1 2 2 3 3 2 0 0
Yes No
强联通分支为一就是强连通图
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #include<stack> #include<vector> #include<set> #include<map> #define L(x) (x<<1) #define R(x) (x<<1|1) #define MID(x,y) ((x+y)>>1) #define eps 1e-8 typedef __int64 ll; #define FRE(i,a,b) for(i = a; i <= b; i++) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define bug pf("Hi\n") using namespace std; #define N 10005 int head[N],low[N],time[N],e_num,tim_num; int n,m,ans,instack[N]; struct stud{ int to,next; }e[N*10]; stack<int>q; inline void add(int u,int v) { e[e_num].to=v; e[e_num].next=head[u]; head[u]=e_num++; } void tarjan(int x) { int i,j; q.push(x); instack[x]=1; time[x]=low[x]=++tim_num; for(i=head[x];i!=-1;i=e[i].next) { int to=e[i].to; if(time[to]==0) { tarjan(to); if(low[x]>low[to]) low[x]=low[to]; } else if(instack[to]&&low[x]>time[to]) low[x]=time[to]; } if(low[x]==time[x]) { ans++; do{ j=q.top(); q.pop(); instack[j]=0; }while(j!=x); } } void solve() { int i,j; mem(time,0); mem(instack,0); ans=tim_num=0; for(i=1;i<=n;i++) if(time[i]==0) tarjan(i); if(ans==1) printf("Yes\n"); else printf("No\n"); } int main() { int i,j; while(scanf("%d%d",&n,&m),n+m) { int u,v; e_num=0; mem(head,-1); while(m--) { sff(u,v); add(u,v); } solve(); } return 0; }
标签:
原文地址:http://blog.csdn.net/u014737310/article/details/44007235