HDU 1269 Tarjan
2015-11-11 13:12
274 查看
迷宫城堡
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 10558 Accepted Submission(s): 4737
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
#include <iostream> #include <cstdio> #include <climits> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <queue> #include <algorithm> #define esp 1e-6 #define inf 0x0f0f0f0f #define LL long long using namespace std; /************************************************ Desiner:hl time:2015/11/06 Exe.Time:78MS Exe.Memory:4356K 题意:亲切的中文题。。 题解:tarjan 。。裸模板题 修改了一下kuangbin神的版 orz 这样看起来方便处理 ************************************************/ const int MAXN = 50010; const int MAXM = 100010; struct Edge { int to,next,st; }edge[MAXM]; int head[MAXN],tot; int Low[MAXN],DFN[MAXN],Stack[MAXN],Belong[MAXN]; int Index,top; int scc; bool Instack[MAXN]; int inde[MAXN],oude[MAXN]; void addedge(int u,int v) { edge[tot].st=u;edge[tot].to = v;edge[tot].next = head[u];head[u] = tot++; } void Tarjan(int u) //kuangbin的tarjan模板 { int v; DFN[u] = Low[u] = ++Index; Stack[top++] = u; Instack[u] = true; for(int i = head[u];i != -1;i = edge[i].next) { v = edge[i].to; if(!DFN[v]) { Tarjan(v); if( Low[u] > Low[v] )Low[u] = Low[v]; } else if(Instack[v] && Low[u] > DFN[v])Low[u] = DFN[v]; } if(Low[u] == DFN[u]) { scc++; do { v = Stack[--top]; Instack[v] = false; Belong[v] = scc; } while( v != u ); } } void solve(int n) { memset(DFN,0,sizeof(DFN)); memset(Instack,false,sizeof(Instack)); Index = scc = top = 0; for(int i = 1;i <= n;i++) if(!DFN[i]) Tarjan(i); } void init() { tot = 0; memset(head,-1,sizeof(head)); } int main(){ int i,j,n,m,a,b; int cost[1111]; while(~scanf("%d%d",&n,&m)&&n+m){ init(); // for(i=1;i<=n;i++){ // scanf("%d",&cost[i]); // } for(i=1;i<=m;i++){ scanf("%d %d",&a,&b); addedge(a,b); } solve(n); if(scc==1||n==1) printf("Yes\n"); else printf("No\n"); // memset(inde,0,sizeof(inde)); // for(i=0;i<tot;i++){ // a=edge[i].st; // b=edge[i].to; // if(Belong[a]!=Belong[b]){ // inde[Belong[b]]++; // oude[Belong[a]]++; // } // } // // int ans1,ans2; // ans1=ans2=0; // int minans[MAXN]; // for(i=1;i<=scc;i++){ // if(inde[i]==0) // ans1++; // // minans[i]=inf; // } // for(i=1;i<=n;i++){ // int tmp=Belong[i]; // if(inde[tmp]==0){ // minans[tmp]=min(minans[tmp],cost[i]); // } // } // for(i=1;i<=scc;i++){ // if(minans[i]!=inf){ // ans2+=minans[i]; // } // } // // printf("%d %d\n",ans1,ans2); } }
相关文章推荐
- 初学图论-Kahn拓扑排序算法(Kahn's Topological Sort Algorithm)
- 初学图论-Bellman-Ford单源最短路径算法
- 初学图论-DAG单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法
- 初学图论-Dijkstra单源最短路径算法基于优先级队列(Priority Queue)的实现
- 封装好的Folyd建图,C++源码
- LCA模板
- 图论学习笔记之一——Floyd算法
- 【LCA】SPOJ QTREE2
- poj 3249 Test for Job 最长路
- HDU 2544
- Timus 1557 Network Attack DFS+各种各种...
- HDU1289 Tarjan-模板题
- Poj2638 网络流+最短路+二分答案
- Aizu1311 分层图最短路 (...大概)
- HDU 3631 Shortest Path
- 二分图匹配模板
- 最短路径 -- spfa
- Six Degrees of Cowvin Bacon(最短路径floyd算法)
- Dijkstra算法