迷宮城堡
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 17273 Accepted Submission(s): 7570
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100000 + 10, INF = 0x3f3f3f3f;
int k;
struct edg
{
int u,v,next;
}E[N*2];
int head[N];
void add(int u,int v)
{
E[k].u=u;
E[k].v=v;
E[k].next=head[u];
head[u]=k++;
}
int ans,dep;
int dfn[N],vis[N],low[N];
stack<int>s;
void Tarjan(int x)
{
dfn[x]=low[x]=++dep;
vis[x]=1;
s.push(x);
for(int i=head[x];i!=-1;i=E[i].next)
{
int v=E[i].v;
if(!dfn[v])
{
Tarjan(v);
low[x]=min(low[x],low[v]);
}
else
{
if(vis[v])
low[x]=min(low[x],dfn[v]);
}
}
if(low[x]==dfn[x])
{
ans++;
int f=-1;
while(f!=x)
{
f=s.top();
s.pop();
vis[f]=0;
}
}
return ;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m),n||m)
{
k=0;
memset(head,-1,sizeof(head));
while(m--)
{
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
}
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
ans=dep=0;
for(int i=1;i<=n;i++)
if(!dfn[i])
Tarjan(i);
if(ans==1)
printf("Yes\n");
else printf("No\n");
}
}