hdu1269 强连通
2015-09-10 21:31
218 查看
题意:判断给定有向图中是否所有点都能够互相到达。
就是询问是否只有一个强连通分量。
View Code
就是询问是否只有一个强连通分量。
#include<stdio.h> #include<string.h> #include<stack> #include<queue> using namespace std; const int maxn=1e4+5; const int maxm=1e5+5; int head[maxn],point[maxm],nxt[maxm],size; int n,t,scccnt; int stx[maxn],low[maxn],scc[maxn]; stack<int>S; void init(){ memset(head,-1,sizeof(head)); size=0; } void add(int a,int b){ point[size]=b; nxt[size]=head[a]; head[a]=size++; } void dfs(int s){ stx[s]=low[s]=++t; S.push(s); for(int i=head[s];~i;i=nxt[i]){ int j=point[i]; if(!stx[j]){ dfs(j); low[s]=min(low[s],low[j]); } else if(!scc[j]){ low[s]=min(low[s],stx[j]); } } if(low[s]==stx[s]){ scccnt++; while(1){ int u=S.top();S.pop(); scc[u]=scccnt; if(s==u)break; } } } void setscc(){ memset(stx,0,sizeof(stx)); memset(scc,0,sizeof(scc)); t=scccnt=0; for(int i=1;i<=n;++i)if(!stx[i])dfs(i); } int main(){ int m; while(scanf("%d%d",&n,&m)!=EOF&&n+m){ init(); while(m--){ int a,b; scanf("%d%d",&a,&b); add(a,b); } setscc(); if(scccnt==1)printf("Yes\n"); else printf("No\n"); } return 0; }
View Code
相关文章推荐
- javascript生成器函数function generator初探和理解
- MSCcomm控件出现ASSERT错误
- 处事变通,转动大脑
- Android程序中实现按钮按下后的界面跳转
- 3_寻找假币问题(分治法)
- Caffe之mnist demo的配置和运行
- Android 中涉及的设计模式
- java数组
- bzoj-2151 种树
- 3_寻找假币问题(分治法)
- Rust and Go
- 使用事件驱动模型实现高效稳定的网络服务器程序
- POJ 3113 Manhattan Wiring(插头DP)
- 白话空间统计十六:增量空间自相关
- N排列盒子涂色方法总和 DP SRM 666 div1 medium SumOverPermutations
- 0909 第一次上机
- iOS简易柱状图(带动画)--新手入门篇
- 密码学的对称加密和不对称加密有哪些和各自特点
- struct 中的宏定义--没有作用域,只是为了逻辑上理解,和放在外部是一样的
- 读《大学之路》有感