您的位置:首页 > 其它

HDU1269:迷宫城堡【强连通】

2015-10-24 18:13 309 查看

迷宫城堡

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 10458    Accepted Submission(s): 4700


[align=left]Problem Description[/align]
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。

 

[align=left]Input[/align]
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。

 

[align=left]Output[/align]
对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。

 

[align=left]Sample Input[/align]

3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0

 

[align=left]Sample Output[/align]

Yes
No AC_code:
#include<cstdio>
#include<cstring>
#define MAX 10005
#define min(a,b) a>b?b:a
using namespace std;
int tot,ans,tot_s,index_s,head[MAX],dfn[MAX],low[MAX],stack[MAX],instack[MAX];
struct Eage
{
int from,to;
int next;
}eage[MAX*10];
void add(int a,int b)
{
Eage e={a,b,head[a]};
eage[tot]=e;
head[a]=tot++;
}
void tarjan(int k)
{
int j,v;
if(ans)
return;
stack[tot_s++]=k;
instack[k]=1;
dfn[k]=low[k]=index_s++;
for(j=head[k];j!=-1;j=eage[j].next)
{
v=eage[j].to;
if(instack[v])
low[k]=min(dfn[v],low[k]);
else
{
tarjan(v);
if(ans)
return ;
low[k]=min(low[k],low[v]);
}
}
if(dfn[k]==low[k])
{
do
{
ans++;
instack[stack[--tot_s]]=0;
}while(stack[tot_s]!=k);
}
}
int main()
{
int m,n,a,b;
while(scanf("%d%d",&n,&m),m|n)
{
tot=0;
memset(head,-1,sizeof(head));
if(n<=1)
{
printf("Yes\n");
continue;
}
if(m==0)
{
printf("No\n");
continue;
}
while(m--)
{
scanf("%d%d",&a,&b);
add(a,b);
}
tot_s=0;
index_s=1;
memset(instack,0,sizeof(instack));
memset(low,-1,sizeof(low));
memset(dfn,-1,sizeof(dfn));
ans=0;
tarjan(1);
if(ans==n)
printf("Yes\n");
else
printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: