链接:点击打开链接
题解:纯tarjan算法
代码:
#include<iostream>
#include<cstring>
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
const int mx=1e4+10;
int n,m;
vector<int> vec[mx];
int dfn[mx],id[mx],stack[mx],size,type,is;
bool vis[mx];
void tarjan(int x){
dfn[x]=id[x]=++is;
stack[++size]=x;
vis[x]=1;
for(int i=0;i<vec[x].size();i++){
int son=vec[x][i];
if(!dfn[son]){
tarjan(son);
id[x]=min(id[x],id[son]);
}
else if(vis[son]){
id[x]=min(id[x],dfn[son]);
}
}
if(id[x]==dfn[x]){
++type;
while(stack[size]!=x){
vis[stack[size]]=0;
size--;
}vis[x]=0,size--;
}
}
int main(){
while(cin>>n>>m,n||m){
for(int i=1;i<=n;i++) vec[i].clear();
int a,b;
while(m--){
scanf("%d%d",&a,&b);
vec[a].push_back(b);
}type=size=is=0;
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
puts(type==1? "Yes":"No");
}
return 0;
}