题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1269
Tarjan模板
我的模板库
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
#define Maxn 10010
#define Maxe 100010
struct Edge
{
int v,nxt;
}e[Maxe];
int head[Maxn],stack[Maxn],dfn[Maxn],low[Maxn],belong[Maxn];
bool instack[Maxn];
int n,m,cnt,scnt,top,ecnt,tot;
void init()
{
cnt=scnt=top=ecnt=0;
memset(head,-1,sizeof(head));
memset(dfn,0,sizeof(dfn));
}
void add_edge(int u,int v)
{
e[++ecnt].nxt=head[u];
e[ecnt].v=v;
head[u]=ecnt;
}
void tarjan(int u)
{
int v,t;
dfn[u]=low[u]=++tot;
instack[u]=1;
stack[++top]=u;
for(int i=head[u];i!=-1;i=e[i].nxt)
{
v=e[i].v;
if(!dfn[v])
{
tarjan(v);
low[u]=min(low[u],low[v]);
}
else if(instack[v])
low[u]=min(dfn[v],low[u]);
}
if(dfn[u]==low[u])
{
scnt++;
do
{
t=stack[top--];
instack[t]=0;
belong[t]=scnt;
}while(t!=u);
}
}
void solve()
{
for(int i=1;i<=n;i++)
if(!dfn[i])
tarjan(i);
}
int main()
{
while(scanf("%d%d",&n,&m) && (n||m))
{
init();
for(int i=1,u,v;i<=m;i++)
{
scanf("%d%d",&u,&v);
add_edge(u,v);
}
solve();
if(scnt == 1) printf("Yes\n");
else printf("No\n");
}
return 0;
}