poj 1144 Network (无向图求割点)
来源:互联网 发布:魔戒 知乎 编辑:程序博客网 时间:2024/05/22 09:43
#include<iostream>#include<string.h>#include<vector>using namespace std;vector <int> vec[110];int dfn[110] , low[110],in[110];int n, step , sum ;void init(){ for(int i=0;i<110;i++) { dfn[i]=low[i]=in[i]=0; vec[i].clear(); } step=sum=0;}void insert(int u , int v){ vec[u].push_back(v); vec[v].push_back(u);}void tarjan(int u , int rt ,int fa){ int v ,son=0; low[u]=dfn[u]=++step; for(int i=0;i<vec[u].size();i++) { v=vec[u][i]; if(!dfn[v]) { son++; tarjan(v , rt ,u); low[u]=min(low[u] , low[v]); if(u==rt && son>1 || low[v]>=dfn[u] && u!=rt ) in[u]=1; //之前我的判断写成了low[v]>=low[u],改的我都快死了。 } else low[u]=min(low[u] , dfn[v]); }}int main(){ int a, b; while(scanf("%d",&n)!=EOF && n) { init(); while(scanf("%d",&a) && a) { while(getchar()!='\n') { scanf("%d",&b); insert(a , b); } } for(int i=1;i<=n;i++) { if(!dfn[i]) { tarjan(i ,i ,0); } } for(int i=1;i<=n;i++) if(in[i]) sum++; printf("%d\n",sum); } return 0;}
之前一直有个盲点,多亏这道裸的求割点: 若该点是割点, 则去掉这个点后,整个图的连通分支一定会增多。例如:
3
1 2
2 3
这个图中1点就不是割点,另外环中的点也不是割点。
另外,这道题导致一直wa的原因,若判断失误,则在存在环(环中的点>=3)时一定会出问题。例如:
6
1 2
2 3
3 4
4 5
5 6
6 3
这个图中递归到u=6时,停止递归 low[6] = 3 ,回到上一层 low[ 5 ] = min ( low[6] , low[5] ) = 3 ,后面判断 low[v] > = low[u]一定存在,所以就会将环中的点也算作割点,导致错误。
- POJ 1144 Network 无向图求割点
- poj 1144 Network (无向图求割点)
- poj 1144 Network 无向图求割点
- POJ 1144 Network 无向图求割点Tarjan
- poj 1144 Network 无向图求割点
- poj 1144 Network 无向连通图求割点
- POJ 1144 Network (无向图求割点)
- POJ 1144--Network 【无向图中割点总数】
- POJ 1144 Network(简单求无向图割顶数)
- POJ 1144 Network(无向图连通分量求割点)
- POJ 1144 Network(简单求无向图割顶数)
- poj 1144 Network【无向图求割顶模板题】
- POJ 1144 Network(简单求无向图割顶数)
- poj 3694 Network 无向图求桥
- UVA 315 Network(无向图求割点)
- uva 315 Network(无向图求割点)
- UVa 315 Network(无向图求割点)
- toj 1026 Network 无向图求割点
- 大侠帮我解决js写不出来的问题
- Creepy People Leave You
- 游戏编程起源(初学者)Ⅵ
- MD5测试程序(C语言版本)
- mysql-监控和优化-总结版
- poj 1144 Network (无向图求割点)
- 四元数预备知识
- 学习笔记2:AndroidManifest.xml
- 与文字相拥 舞尽人间芳华
- OpenFlow技术
- 相似度计算
- MySQL 添加列,修改列,删除列
- DateTime 格式化字符串
- Linux I2C 驱动的几个概念