poj3352 利用边的双连通性质求解
2013-05-21 17:24
246 查看
给你一个无向图,求解至少需要添加几条边,就能保证删除任一条边时,图仍然是连通的
思路:
求解至少添加多少条边,可以使该图成为边的双连通图
利用tarjan算法:求解low[]值记录父亲结点,然后low[]相同的点,在一个连通分量中,然后缩点
求解出度为1的点的个数ans,答案就是(ans+1)/2;
思路:
求解至少添加多少条边,可以使该图成为边的双连通图
利用tarjan算法:求解low[]值记录父亲结点,然后low[]相同的点,在一个连通分量中,然后缩点
求解出度为1的点的个数ans,答案就是(ans+1)/2;
#include<iostream> #include<algorithm> #include<cstdio> #include<vector> #include<string.h> using namespace std; const int Max=1111; int low[Max]; int dfn[Max]; int cnt; int Branch; int dre[Max]; vector<int>Gra[Max]; int MIN(int a,int b) { return a>b?b:a; } void tarjan(int x,int fa) { low[x]=dfn[x]=cnt++; for(int i=0;i<Gra[x].size();i++) { int u=Gra[x][i]; if(u==fa) continue; if(!dfn[u]) { tarjan(u,x); low[x]=MIN(low[x],low[u]); } else if(low[x]>dfn[u]) low[x]=dfn[u]; } } void start(int n ) { memset(dfn,0,sizeof(dfn)); cnt=1; Branch=0; for(int i=1;i<=n;i++) { if(!dfn[i]) { tarjan(i,i); Branch++; } } } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { memset(dre,0,sizeof(dre)); for(int i=1;i<Max;i++) Gra[i].clear(); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); Gra[u].push_back(v); Gra[v].push_back(u); } start(n); for(int i=1;i<=n;i++) { for(int j=0;j<Gra[i].size();j++) { if(low[i]!=low[Gra[i][j]])//记录出度: dre[low[i]]++; } } int ans=0; for(int i=1;i<cnt;i++) if(dre[i]==1) ans++; printf("%d\n",(ans+1)/2); } return 0; }
相关文章推荐
- poj2158 利用next[]的性质求解
- 利用Delphi里面的IdIcmpClient控制来检测网络是否正常连通
- 利用异或求解 N^N=0 N^0=N
- Uva679--利用二叉树性质的有趣解法
- 将一棵二叉树的所有结点存储在一维数组中,虚结点用#表示,利用性质5
- Electrical Outlets 利用树的性质解题
- 华为oj素数伴侣,利用匈牙利算法求解
- 第十二周 项目四(3) 利用遍历思想求解图问题
- PAT树 File Transfer——利用不相交集ADT求连通分图数目
- 第十一周-项目4 - 利用遍历思想求解图问题(1)
- 第十二周 项目四(7) 利用遍历思想求解图问题
- 十二周 项目四 利用便利思想求解图问题(1)
- 第十一周 项目四 利用遍历的思想求解图问题(1)——(5)
- 第十二周项目4——利用遍历思想求解图问题(3)-输出所有路径
- hdu 4651 Partition (利用五边形定理求解分割数)
- 第十一周 项目4 — 利用遍历思想求解图问题(6)
- 第十二周 项目4-l利用遍历思想求解图问题
- 利用描点绘图法求解复杂函数
- 第十二周项目4——利用遍历思想求解图问题(2)
- 第十二周项目4——利用遍历思想求解图问题