hdu 1269 迷宫城堡【强连通+Kosaraju】
来源:互联网 发布:零售药店收银软件 编辑:程序博客网 时间:2024/05/01 12:43
迷宫城堡
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 11905 Accepted Submission(s): 5341
Problem Description
为了训练小希的方向感,Gardon建立了一座大城堡,里面有N个房间(N<=10000)和M条通道(M<=100000),每个通道都是单向的,就是说若称某通道连通了A房间和B房间,只说明可以通过这个通道由A房间到达B房间,但并不说明通过它可以由B房间到达A房间。Gardon需要请你写个程序确认一下是否任意两个房间都是相互连通的,即:对于任意的i和j,至少存在一条路径可以从房间i到房间j,也存在一条路径可以从房间j到房间i。
Input
输入包含多组数据,输入的第一行有两个数:N和M,接下来的M行每行有两个数a和b,表示了一条通道可以从A房间来到B房间。文件最后以两个0结束。
Output
对于输入的每组数据,如果任意两个房间都是相互连接的,输出"Yes",否则输出"No"。
Sample Input
3 3
1 2
2 3
3 1
3 3
1 2
2 3
3 2
0 0
Sample Output
Yes
No
Author
Gardon
Source
HDU 2006-4 Programming Contest
思路:
1、如果有房间A能够到达房间B,而且有房间B能够房间A,那么就称A,B是强连通的,对于这个题,要求是否任意两个房间都是想通的,其实就是在让我们求其强连通分量是否为1.如果为1,输出Yes,否则输出No
2、对于算法的实现,我这里采用了Kosaraju算法来实现求强连通分量。
3、对于Kosaraju算法的实现,简述其过程:
(1)按照原图Dfs一遍,求其每个节点离开的时间,即num【time】=u(当前节点)
(2)求出num【】之后,按照其逆序(n-1)并按照其反图再求一遍Dfs。
AC代码:
#include<stdio.h>#include<string.h>using namespace std;int head[100000];int head2[100000];struct EdgeNode{ int from; int to; int next;}e[100000],ee[100000];int vis[100000];int num[100000];int n,m,cont,cont2,sig;void add(int from,int to){ e[cont].from=from; e[cont].to=to; e[cont].next=head[from]; head[from]=cont++;}void add2(int from,int to){ ee[cont2].from=from; ee[cont2].to=to; ee[cont2].next=head2[from]; head2[from]=cont2++;}void Dfs(int u){ vis[u]=1; for(int k=head[u];k!=-1;k=e[k].next) { int v=e[k].to; if(vis[v]==0) { Dfs(v); } } num[sig++]=u;}void Dfs2(int u){ vis[u]=1; for(int k=head2[u];k!=-1;k=ee[k].next) { int v=ee[k].to; if(vis[v]==0) { Dfs2(v); } }}void Kosaraju(){ sig=1; memset(num,0,sizeof(num)); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) { if(vis[i]==0) { Dfs(i); } } memset(vis,0,sizeof(vis)); sig=0; for(int i=n;i>=1;i--) { if(vis[num[i]]==0) { sig++; Dfs2(num[i]); } } if(sig==1) { printf("Yes\n"); } else printf("No\n");}int main(){ while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; cont=0; cont2=0; memset(head,-1,sizeof(head)); memset(head2,-1,sizeof(head2)); for(int i=0;i<m;i++) { int x,y; scanf("%d%d",&x,&y); add(x,y); add2(y,x); } Kosaraju(); }}
- hdu 1269 迷宫城堡【强连通+Kosaraju】
- HDU-1269 迷宫城堡 (强连通分量[Kosaraju])
- HDU 迷宫城堡 强连通图 kosaraju and tarjan
- hdu 1269 迷宫城堡 强连通分量
- HDU 1269 迷宫城堡 强连通
- HDU 1269 迷宫城堡(强连通分量)
- 【HDU】1269 迷宫城堡 强连通
- HDU 1269 迷宫城堡(强连通分量)
- HDU 1269 迷宫城堡(强连通)
- HDU 1269-迷宫城堡(强连通分量)
- HDU - 1269 迷宫城堡(强连通分量)
- [HDU 1269] 迷宫城堡 强连通分量
- hdu 1269 迷宫城堡 强连通分量
- hdu 1269 迷宫城堡【强连通Tarjan】
- hdu 1269 迷宫城堡(强连通)
- hdu 1269 迷宫城堡 强连通分量
- 【HDU】 1269 迷宫城堡 强连通分量
- 【有向图的强连通分】HDUOJ 1269 迷宫城堡(Kosaraju算法+Tarjan算法)
- 使用axis1+spring+hibernate搭建webservice框架(一)
- mongodb常用命令
- Hadoop入门之Hadoop中的HelloWorld程序
- Xcode清除缓存、清理多余证书
- Block (二) 块方法的应用症状枚举
- hdu 1269 迷宫城堡【强连通+Kosaraju】
- 利用.dSYM和.app文件准确定位Crash位置
- OnePlus One Root
- hjr教程-DSP(五):汇编运算与段的理解
- 高级Android工程师面试回忆录
- 【JavaScript】——兼容浏览器的居中显示+关闭页面
- Git的使用
- 使用axis1+spring+hibernate搭建webservice框架(二)
- OpenCV中Mat类的重载运算符operator()的用法!