poj 2762 强连通分量+拓扑排序(判断图是否为单向连通)
来源:互联网 发布:沈阳云易惠网络 编辑:程序博客网 时间:2024/06/02 23:52
题意:给定一个有向图,判断此图是否为单向连通(=半连通)。(注意单向连通和弱连通的区别:前者是图中任意两点u和v,或者有uv路或者有vu路;后者是有向图的基图是连通图)
思路:先求出强连通分量,然后判断拓扑排序是否为一。记得算法课讲过一个DAG图是单向连通当且仅当其拓扑排序唯一。据此此题可解。
#include <stdio.h>#include <string.h>#define min(a,b) ((a)<(b)?(a):(b))#define clr(s,t) memset(s,t,sizeof(s))#define N 1005struct edge{ int y,next;}e[6004],et[6003];int dfn[N],low[N],st[N],inst[N],first[N],strong[N],d[N],g[N][N],q[N];int n,m,T,top,stop,id,con,num;void init(){ top = stop = id = con = num = 0; clr(first, -1); clr(dfn, -1); clr(inst, 0); clr(g, 0); clr(d, 0);}void add(int x,int y){ e[top].y = y; e[top].next = first[x]; first[x] = top++;}void tarjan(int x){ int i,y; dfn[x] = low[x] = ++id; inst[x] = 1; st[stop++] = x; for(i = first[x];i!=-1;i=e[i].next){ y = e[i].y; if(dfn[y] == -1){ tarjan(y); low[x] = min(low[x],low[y]); }else if(inst[y]) low[x] = min(low[x],dfn[y]); } if(dfn[x] == low[x]){ con++; do{ strong[st[--stop]] = con; inst[st[stop]] = 0; }while(x != st[stop]); }}int main(){ scanf("%d",&T); while(T--){ int i,j,a,b; init(); scanf("%d %d",&n,&m); for(i = 0;i<m;i++){ scanf("%d %d",&a,&b); add(a,b); } for(i = 1;i<=n;i++) if(dfn[i] == -1) tarjan(i); for(i = 1;i<=n;i++) for(j = first[i];j!=-1;j=e[j].next) if(strong[i] != strong[e[j].y]){ d[strong[e[j].y]]++; g[strong[i]][strong[e[j].y]] = 1;//以强连通分量为顶点重新构图 } for(i = 1;i<=con;i++){ for(j = 1;j<=con;j++) if(!d[j]){ q[++num] = j; d[j] = -1; } if(num!=i)//拓扑排序如果唯一,每次只出现一个度为0的点 break; for(j = 1;j<=con;j++) if(g[q[num]][j]) d[j]--; } if(i>con) printf("Yes\n"); else printf("No\n"); }}
0 0
- poj 2762 强连通分量+拓扑排序(判断图是否为单向连通)
- POJ 2762 证明是否为单向连通图 强连通缩点+类拓扑排序
- cf 659E(强连通分量,判断无向图是否成环,拓扑排序思想)
- poj 2762(弱连通:强连通+缩点+拓扑排序)
- 【图论】强连通分量和拓扑排序
- POJ 2762 Going from u to v …(强连通分量+拓扑排序)
- POJ 2762 Going from u to v …(强连通分量+拓扑排序)
- 判断强连通图、单向连通图、弱连通图
- 【BZOJ1093】【ZJOI2007】最大半连通子图 强连通分量缩点+sort去重边+拓扑排序
- 【BZOJ 1093】【ZJOI 2007】【最大半连通子图】【tarjan强连通分量】【拓扑排序dp】
- 强连通分量,拓扑序
- NOIP 2009 最优贸易 (强连通分量、缩点、拓扑排序、SPFA、分层图)
- COMP2907 图论 强连通判断 拓扑排序
- poj 2762(弱联通:强连通+缩点+拓扑排序)
- poj 2762 Popular Cows + 强连通 + 重构图 + 拓扑排序
- [POJ 2762]Going from u to v or from v to u? (强连通分量+拓扑排序)
- POJ 2762 Going from u to v or from v to u?(强连通分量+拓扑排序)
- POJ - 2762 Going from u to v or from v to u?(拓扑排序+强连通分量)
- HDU 5179
- iOS 用C语言实现画矩形
- 建小顶堆以及推排序
- PHP 常用功能
- 【转】文件下载中文显示 content-disposition 正确设置
- poj 2762 强连通分量+拓扑排序(判断图是否为单向连通)
- 2012年10月9号阿里巴巴笔试(c++)
- 深入web请求
- 幂等
- Spring4 + Junit4 实现测试中ApplicationContext的获取
- poj 1298 he Hardest Problem Ever
- iOS实现小型计算器
- android 使用md5加密
- 浙大机试2014:Kuchiguse