UVA10972 - RevolC FaeLoN(双连通分量)
题目链接
题意: 给定一个无向图,问最少加入多少条边,使得这个图成为连通图
思路:首先注意题目给出的无向图可能是非连通的,即存在孤立点。处理孤立点之后。其它就能够当作连通块来处理。事实上跟POJ3352非常像,仅仅只是存在孤立点而已。所以找出桥,缩点,然后统计度数为0(伸出两条边)的点u和度数为1(伸出一条边)的点。最后的答案为(2 * u + v + 1) / 2。
POJ3352
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <utility>
#include <algorithm>using namespace std;const int MAXN = 1005;struct Edge{int to, next;
}edge[MAXN * 100];int head[MAXN], tot;
int Low[MAXN], DFN[MAXN], dg[MAXN], used[MAXN];
int Index;
int bridge;void addedge(int u, int v) {edge[tot].to = v;edge[tot].next = head[u];head[u] = tot++;
}void Tarjan(int u, int pre) {int v; Low[u] = DFN[u] = ++Index; for (int i = head[u]; i != -1; i = edge[i].next) { v = edge[i].to; if (v == pre) continue; if (!DFN[v]) { Tarjan(v, u); if (Low[u] > Low[v]) Low[u] = Low[v]; if (Low[v] > DFN[u])bridge++;} else if (Low[u] > DFN[v]) Low[u] = DFN[v]; }
}void init() {memset(head, -1, sizeof(head));memset(DFN, 0, sizeof(DFN)); memset(Low, 0, sizeof(Low)); Index = tot = 0;bridge = 0;
}void solve(int N) {for (int i = 1; i <= N; i++)if (!DFN[i]) {Tarjan(i, i);bridge++;}if (bridge == 1) {printf("0\n"); }else {memset(used, 0, sizeof(used));memset(dg, 0, sizeof(dg)); for (int u = 1; u <= N; u++) {if (head[u] == -1) {used[Low[u]] = 1;continue;}for (int i = head[u]; i != -1; i = edge[i].next) {int v = edge[i].to; used[Low[u]] = used[Low[v]] = 1;if (Low[u] != Low[v]) {dg[Low[u]]++; }}}int ans = 0;for (int u = 1; u <= N; u++) {if (used[u] && dg[u] == 0) ans += 2; else if (dg[u] == 1) ans++; }ans = (ans + 1) / 2;printf("%d\n", ans);}
}int main() {int n, m; while (scanf("%d%d", &n, &m) != EOF) {init(); int u, v;while (m--) {scanf("%d%d", &u, &v); addedge(u, v);addedge(v, u);}solve(n);}return 0;
}
UVA10972 - RevolC FaeLoN(双连通分量)相关推荐
- Tarjan算法应用 (割点/桥/缩点/强连通分量/双连通分量/LCA(最近公共祖先)问题)...
转载自:http://hi.baidu.com/lydrainbowcat/blog/item/2194090a96bbed2db1351de8.html 基本概念: 1.割点:若删掉某点后,原连通图 ...
- AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)
整理的算法模板合集: ACM模板 我们知道在同一个边双连通分量中的点没有必经边(因为至少有两条分离的路径). 所以我们直接tarjan求出桥后缩点,然后求一下树上两点间的距离即可. 那么如何求树上两点 ...
- UVA1364 Knights of the Round Table(双连通分量、二分图染色,超详细解释)
整理的算法模板合集: ACM模板 UVA1364 Knights of the Round Table 题目中要求互相有憎恨关系的人不能坐在相邻的位置,一个圆桌可以很形象地看作是一个环,也就是说我们两 ...
- 【图论专题】无向图的双连通分量
A.AcWing 395. 冗余路径 结论:变成边双连通分量所需要新建的边数 无向图 连多少条边使得整个无向图变成任意两个点之间都有两条完全不相同的路径. 结论1:任意两个点之间都有两条完全不相同的路 ...
- Uvalive 3523 - Knights of the Round Table (双连通分量+二分图)
题目链接 https://vjudge.net/problem/UVALive-3523 [题意] 有n个骑士经常举行圆桌会议,每次圆桌会议应至少有3个人参加且人数必须是奇数,相互憎恨的骑士不能坐在圆 ...
- UVA 610 Street Directions 双连通分量
首先找到全部双连通分量,然后对于某一个结点数大于2的连通分量,可以把全部的边改成单向的,按DFS的顺序. 结点数为2的也就是一条为桥的边,必须保持双向. //#pragma comment(linke ...
- [Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分)
[Codeforces 555E]Case of Computer Network(Tarjan求边-双连通分量+树上差分) 题面 给出一个无向图,以及q条有向路径.问是否存在一种给边定向的方案,使得 ...
- poj 3352 双连通分量
至少加几条边成为双连通分量 #include <iostream> #include <cstdio> #include <cstring> using names ...
- 无向图——双连通分量
双连通图:在无向图连通图中,如果删除该图中的任意一点和依附它的边,不改变图的连通性,则称该图为双连通的无向图. 由上述定义可知,双连通分量中,每两个结点之间至少有两条不同的路径可以相互到达. 割点:在 ...
最新文章
- 让浏览器开挂的插件,测评师教你如何选
- docker api 基本介绍和使用
- uva1025城市里的间谍
- 打断点是什么意思_黄金走势分析?股票所说的大盘几千点,是指的什么意思
- python 函数的*args,**kwargs
- publishing failed with multiple errors resource is out of sync with the file system--转
- insert into 时间_2021国家公务员考试报名时间_国考什么时候报名
- 阿里秒杀系统架构优化思路
- linux下c语言按q退出_在linux下C语言写了一个while循环,怎么实现按任意键退出。如何编写程序?...
- [原创]换一份工作要考虑什么?
- frameset 后台管理_易达CMS下载-易达CMS(免费开源网站管理系统)v3.0.0.1103免费版
- 【操作系统】进程与线程
- 你该怎么去学软件测试,过来人告诉你
- IIS安装和ASP.NET Web应用程序开发期间部署到IIS自定义主机域名并附加进程调试...
- DropDownList的AppendDataBoundItems属性
- wps2019怎么调整字间距_wps2019表格和文字间距太大怎么调整?
- 关于扩展欧几里得算法的证明
- 用php求常见图形的面积,技巧:数学图形面积计算的十种方法!
- NR SRB and message transfer
- 微信扫码提示在浏览器中打开的遮罩代码