【个人专题一】强连通——Hoj_1269
2011-08-26 12:23
260 查看
//题意:给定点集和边集,问是不是所有点在一个强连通内
//思路:纯裸的强连通
//思路:纯裸的强连通
#include<iostream> #include<stack> using namespace std; struct Node { int dest; struct Node *next; }*node[10001],*p; stack<int>Q; bool Visited[10001],InStack[10001]; int dfn[10001],low[10001],beNum,nTime; int N,M; void AddNode(int st,int end){ p=new struct Node; p->dest=end; p->next=node[st]; node[st]=p; } void Init()//初始化 { int i; for(i=1;i<=N;i++) node[i]=NULL; while(!Q.empty()) Q.pop(); memset(Visited,false,sizeof(Visited)); memset(InStack,false,sizeof(InStack)); beNum=nTime=0; int a,b; for(i=0;i<M;i++) { scanf("%d%d",&a,&b); AddNode(a,b); } } int min(int ta,int tb) { if(ta>tb) return tb; return ta; } void Tarjan(int t) { dfn[t]=low[t]=++nTime; Q.push(t); Visited[t]=InStack[t]=true; struct Node *q; int x; for(q=node[t];q!=NULL;q=q->next) { x=q->dest; if(!Visited[x]) { Tarjan(x); low[t]=min(low[t],low[x]); } else if(InStack[x]) low[t]=dfn[x]; } if(dfn[t]==low[t]) { beNum++; do { x=Q.top(); Q.pop(); }while(x!=t); } } void doit() { int i; for(i=1;i<=N;i++) { if(!Visited[i]) Tarjan(i); } if(beNum==1) printf("Yes\n");//如果只有一个强连通子集,则yes else printf("No\n"); } int main() { while(scanf("%d%d",&N,&M) && (N||M)) { Init(); doit(); } return 0; }
相关文章推荐
- 【个人专题一】强连通——Hoj_3639(RE)
- 【个人专题一】强连通——Poj_2186
- 【个人专题一】强连通——Poj_1236
- 【个人专题一】强连通——Poj_2553
- 【个人专题一】强连通+拓扑排序——Poj_2762
- Linux负载均衡专题(个人心得和笔记按照下面的步骤就能建立可用的集群)
- hdu1269强连通水题 如果让我说:我只能说,实力决定一切
- hdu 1269 迷宫城堡 判断图是否强连通
- XTU算法专题个人赛3 (DP专题)解题报告
- 强连通专题
- 【HDU】1269 迷宫城堡 强连通
- 2016XTU算法专题个人赛4 题解
- hdu 1269 迷宫城堡(强连通)
- Linux负载均衡专题(个人心得和笔记按照下面的步骤就能建立可用的集群)
- tarjan算法入门整理专题(判断是否是一个强连通、通过缩点求至少加几条边让整个图变成强连通和传递的最小费用)
- 图论强连通专题:POJ1236
- 高品质的Bootstrap3.0主题模板(专题着陆页/个人主页/单页网站/作品集网页)
- SpringMVC专题——SpringMVC的流程(个人理解)
- 程序猿214情人节专题----基于GitHub打造个人网站及Android的录制功能使用