hdu 1269 迷宫城堡 判断图是否强连通

来源:互联网 发布:韩顺平js视频教程下载 编辑:程序博客网 时间:2024/04/30 22:04
利用kosaraju思想:如果有向图是强连通的,则从任意一个顶点开始s开始dfs,它可以访问到图的所有点,如果不能访问到所有点,图肯定不是强连通的。s能访问到图中所有点,不能说明其他任意顶点能访问到s。如果将图逆置,s仍能访问到所有点,说明原图中其他的顶点也能访问到s,图就是强连通的
#include<cstdio>#include<cstring>#include<vector>using namespace std;const int maxn = 10001;vector<int> g[maxn];vector<int> rg[maxn];int vis[maxn];int cnt;void dfs_1(int i){vis[i]=1;for(int j=0;j<g[i].size();j++){if(!vis[g[i][j]])dfs_1(g[i][j]);}cnt++;}void dfs_2(int i){vis[i]=1;for(int j=0;j<rg[i].size();j++){if(!vis[rg[i][j]])dfs_2(rg[i][j]);}cnt++;}int main(){int n,m,a,b;while(scanf("%d%d",&n,&m)&&(n!=0||m!=0)){for(int i=1;i<=n;i++){g[i].clear();rg[i].clear();}cnt=0;for(int i=0;i<m;i++){scanf("%d%d",&a,&b);g[a].push_back(b);rg[b].push_back(a);}memset(vis,0,sizeof(vis));dfs_1(1);if(cnt<n){printf("No\n");continue;}cnt=0;memset(vis,0,sizeof(vis));dfs_2(1);if(cnt<n)printf("No\n");elseprintf("Yes\n");}}

0 0
原创粉丝点击