分析:题意很简单、就是问图的SCC是否为1、于是学习tarjan算法、判断图中SCC数量、
#include
#include
#include
using namespace std;
const int maxn=10001;
struct node{
int e,next;
}mpt[maxn*10];
int head[maxn];
int n,m,k;
int low[maxn];
int dfn[maxn];
int vis[maxn];
int que[maxn];
int cnt,index,top;
void add(int s,int t){
mpt[k].e=t;
mpt[k].next=head[s];
head[s]=k++;
}
void tarjan(int s){
low[s]=dfn[s]=++index;
que[++top]=s;
vis[s]=1;
for(int i=head[s];i!=-1;i=mpt[i].next){
int e=mpt[i].e;
if(!dfn[e]){
tarjan(e);
low[s]=min(low[s],low[e]);
}
else if(vis[e]){
low[s]=min(low[s],dfn[e]);
}
}
if(low[s]==dfn[s]){
cnt++;
int e;
do{
e=que[top--];
vis[e]=0;
}while(s!=e);
}
}
void init(){
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
memset(vis,0,sizeof(vis));
cnt=k=index=0;
top=-1;
}
int main(){
int n,m;
while(scanf("%d%d",&n,&m)!=EOF){
if(n==0&&m==0)break;
init();
int a,b;
for(int i=0;i