【POJ 3177】Redundant Paths
http://poj.org/problem?id=3177
又写了一遍手动栈。。。
把边双都缩点,缩成一棵树,答案就是树中度数为1的点的个数除2上取整。
为什么呢?因为1个度数为1的点的树需要多连0条边,2个度数为1的点的树需要多连1条边,3个度数为1的点的树需要多连2条边。
然后对于n(n>3)个度数为1的点的树,连一次边后再缩点能变成有n-2个度数为1的点的树。
无向图边双跟有向图强连通分量的求法很像喔,重点在于特判后继节点是否是自己的father连过来的边。
#include<cstdio>
#include<bitset>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 5003;
const int M = 10003;
bitset <N> inst;
struct node {int nxt, to;} E[M << 1];
int cnt = 1, tot = 0, bel[N], point[N], cur[N], st[N], sta[N], top, statop, fa[N], low[N], dfn[N], n, m, fae[N];
void ins(int u, int v) {E[++cnt] = (node) {point[u], v}; point[u] = cnt;}
void tarjan(int x) {
	st[top = 1] = x;
	while (top) {
		int u = st[top];
		if (!dfn[u]) {
			inst[sta[++statop] = u] = 1;
			dfn[u] = low[u] = ++cnt;
		}
		if (cur[u]) {
			if (cur[u] == fae[u]) {cur[u] = E[cur[u]].nxt; continue;}
			int v = E[cur[u]].to;
			if (inst[v]) low[u] = min(low[u], dfn[v]);
			else if (!dfn[v]) fa[st[++top] = v] = u, fae[v] = cur[u] ^ 1;
			cur[u] = E[cur[u]].nxt;
		} else {
			low[fa[u]] = min(low[fa[u]], low[u]);
			if (dfn[u] == low[u]) {
				++tot;
				while (sta[statop] != u) {
					bel[sta[statop]] = tot;
					inst[sta[statop]] = 0;
					--statop;
				}
				bel[u] = tot;
				inst[u] = 0;
				--statop;
			}
			--top;
		}
	}
}
int du[N];
int main() {
	scanf("%d%d", &n, &m);
	int u, v;
	for (int i = 1; i <= m; ++i) {
		scanf("%d%d", &u, &v);
		ins(u, v); ins(v, u);
	}
	for (int i = 1; i <= n; ++i) cur[i] = point[i];
	cnt = 0;
	for (int i = 1; i <= n; ++i)
		if (!dfn[i])
			tarjan(i);
	for (int i = 1; i <= n; ++i)
		for (int j = point[i]; j; j = E[j].nxt)
			if (bel[i] != bel[E[j].to] && E[j].to > i)
				++du[bel[i]], ++du[bel[E[j].to]];
	int ret = 0;
	for (int i = 1; i <= tot; ++i)
		if (du[i] == 1) ++ret;
	printf("%d\n", (ret + 1) >> 1);
	return 0;
}
												
											【POJ 3177】Redundant Paths的更多相关文章
- 【POJ 3177】Redundant Paths(边双连通分量)
		
求出每个边双连通分量缩点后的度,度为1的点即叶子节点.原图加上(leaf+1)/2条边即可变成双连通图. #include <cstdio> #include <cstring> ...
 - (poj   3177) Redundant Paths
		
题目链接 :http://poj.org/problem?id=3177 Description In order to <= F <= ,) grazing fields (which ...
 - POJ 3177 (Redundant Paths) —— (有重边,边双联通,无向图缩点)
		
做到这里以后,总算是觉得tarjan算法已经有点入门了. 这题的题意是,给出若干个点和若干条边连接他们,在这个无向图中,问至少增加多少条边可以使得这个图变成边双联通图(即任意两点间都有至少两条没有重复 ...
 - bzoj 2295: 【POJ Challenge】我爱你啊
		
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MB Description ftiasch是个十分受女生欢迎的同学,所以 ...
 - 【链表】BZOJ 2288: 【POJ Challenge】生日礼物
		
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 382 Solved: 111[Submit][S ...
 - BZOJ2288: 【POJ Challenge】生日礼物
		
2288: [POJ Challenge]生日礼物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 284 Solved: 82[Submit][St ...
 - BZOJ2293: 【POJ Challenge】吉他英雄
		
2293: [POJ Challenge]吉他英雄 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 80 Solved: 59[Submit][Stat ...
 - BZOJ2287: 【POJ Challenge】消失之物
		
2287: [POJ Challenge]消失之物 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 254 Solved: 140[Submit][S ...
 - BZOJ2295: 【POJ Challenge】我爱你啊
		
2295: [POJ Challenge]我爱你啊 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 126 Solved: 90[Submit][Sta ...
 
随机推荐
- 【BZOJ】2054: 疯狂的馒头
			
[题意]给定n个元素,m次给一段区间染色为i,求最终颜色. [算法]并查集 [题解]因为一个点只受最后一次染色影响,所以倒过来每次将染色区间用并查集合并,父亲指向最右边的点. 细节: 1.fa[n+1 ...
 - 暑假集训——cf热身赛部分题有感加其题解
			
刚刚开始集训,集训队队长暂时还没有拉专题,而是拉了部分codeforces上过题人数在2000左右的题组成了一场热身赛(其实就是一场练习),花了一天时间终于把它刷完了,其中很多题让我学到了很多骚操作, ...
 - Ubuntu 修改IP地址
			
Ubuntu 修改IP地址1.ubuntu系统修改IP地址:sudo vim /etc/network/interfacesauto eth0iface eth0 inet staticaddress ...
 - IOException while loading persisted sessions:
			
严重: IOException while loading persisted sessions: java.io.EOFException java.io.EOFException at java. ...
 - C/C++中手动获取调用堆栈【转】
			
转自:http://blog.csdn.net/kevinlynx/article/details/39269507 版权声明:本文为博主原创文章,未经博主允许不得转载. 当我们的程序core掉之后, ...
 - [转载]Python: 你不知道的 super
			
原文出处: geekvi super() 的入门使用 在类的继承中,如果重定义某个方法,该方法会覆盖父类的同名方法,但有时,我们希望能同时实现父类的功能,这时,我们就需要调用父类的方法了,可通过使用 ...
 - SQL利用Case When Then多条件判断SQL 语句
			
http://www.cnblogs.com/kevin2013/archive/2010/07/02/1769682.html SQL利用Case When Then多条件判断SQL ,用于sele ...
 - js中常用的数组方法
			
在数组的尾部增加或删除某个元素:push() 和 pop() push() : 在数组的尾部追加一个或多个元素,并返回数组的长度 pop():在数组的尾部删除一个元素,并返回被删除项 var arr ...
 - Python的数值和字符串
			
Python数据类型 1.数值 --类型: 1/整型 2/长整型 3/浮点型 -- 0.0, 12.0, -18.8, 3e+7等 4/复数型 -- complex In []: 0x34al ...
 - 理解rest架构
			
越来越多的人开始意识到,网站即软件,而且是一种新型的软件. 这种"互联网软件"采用客户端/服务器模式,建立在分布式体系上,通过互联网通信,具有高延时(high latency).高 ...