代码不能粘贴复制,只有充分理解之后自己亲手敲的才是真正理解了,
即使是参考他人的也有收获
理解了tarjian算法让自己对算法有了好感,感觉算法真的好强,解决看起来不能解决的问题,
那是一种超越
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
#define MAXVER 10010
vector<int> g[MAXVER];
stack<int> st;
int visit[MAXVER];
int instack[MAXVER];
int dfn[MAXVER],low[MAXVER];
int n,m,index,num;
void tarjian(int u)
{
int i,v;
dfn[u]=low[u]=index++;
st.push(u);
instack[u]=1;
visit[u]=1;
for(i=0;i<g[u].size();i++)
{
v=g[u][i];
if(!visit[v])
{
tarjian(v);
low[u]=low[u]<low[v]?low[u]:low[v];
}else if(instack[v])
{
low[u]=low[u]<dfn[v]?low[u]:dfn[v];
}
}
if(dfn[u]==low[u])
{
do
{
v=st.top();
instack[v]=0;
st.pop();
}while(u!=v);
num++;
}
if(num>=2)
return;
}
int main()
{
int start,end,i;
while(scanf("%d%d",&n,&m),n+m)
{
for(i=0;i<=n;i++)
g[i].clear();
for(i=0;i<m;i++)
{
scanf("%d%d",&start,&end);
g[start].push_back(end);
}
memset(visit,0,sizeof(visit));
memset(instack,0,sizeof(instack));
index=0;
num=0;
for(i=1;i<=n;i++)
{
if(!visit[i])
tarjian(i);
if(num>=2)
break;
}
if(num==1)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}