您的位置:首页 > 其它

【HDU1269】迷宫城堡

2017-07-15 15:54 225 查看
题目链接: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++;
<
4000
span class="hljs-keyword">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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: