Poj 3177 Redundant Paths (双连通分支+节点统计)
2015-07-22 20:45
399 查看
题目描述:
给出一个无向的连通图,问最少加入几条边,才能使所给的图变为无桥的双连通图?
解题思路:
可以求出原图中所有的不包含桥的所有最大连通子图,然后对连通子图进行标记缩点,统计度为1的叶子节点leaf有多少个,答案就是(leaf+1)/2;
这个题目有重边,在处理的时候要注意下。
给出一个无向的连通图,问最少加入几条边,才能使所给的图变为无桥的双连通图?
解题思路:
可以求出原图中所有的不包含桥的所有最大连通子图,然后对连通子图进行标记缩点,统计度为1的叶子节点leaf有多少个,答案就是(leaf+1)/2;
这个题目有重边,在处理的时候要注意下。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; const int maxn = 5005; struct node { int to, next; } edge[maxn*2]; int low[maxn], dfn[maxn], head[maxn], id[maxn], in[maxn]; int stack[maxn], tot, ntime, cnt, top, In; void init () { tot = ntime = cnt = top = In = 0; memset (in, 0, sizeof(in)); memset (id, 0, sizeof(id)); memset (low, 0, sizeof(low)); memset (dfn, 0, sizeof(dfn)); memset (head, -1, sizeof(head)); memset (stack, 0, sizeof(stack)); } void Add (int from, int to) { edge[tot].to = to; edge[tot].next = head[from]; head[from] = tot++; } void Tarjan (int u, int father) { int k = 0; low[u] = dfn[u] = ++ntime; stack[top++] = u; for (int i=head[u]; i!=-1; i=edge[i].next) { int v = edge[i].to; if (v==father && !k) {//判定重边 k++; continue; } if (!dfn[v]) { Tarjan (v, u); low[u] = min (low[v], low[u]); } else low[u] = min (low[u], dfn[v]); } if (low[u] == dfn[u]) { cnt ++; while (1) {//对同一个连通块内的点染色 int v = stack[--top]; id[v] = cnt; if (v == u) break; } } } int main () { int n, m; while (scanf ("%d %d", &n, &m) != EOF) { init (); while (m --) { int u, v; scanf ("%d %d", &u, &v); Add (u, v); Add (v, u); } for (int i=1; i<=n; i++) if (!dfn[i]) Tarjan (i, 0); for (int i=1; i<=n; i++) for (int j=head[i]; j!=-1; j=edge[j].next) { int u = id[i]; int v = id[edge[j].to]; if (v != u) {//统计缩点后的图中每个点的度 in[v] ++; in[u] ++; } } for (int i=1; i<=cnt; i++) if (in[i] == 2)//因为是无向图建图方式的原因,当度为2的时候才是叶子节点 In ++; printf ("%d\n", (In+1)/2); } return 0; }
相关文章推荐
- fragment-实例创建跟使用
- c语言归并排序(poj2299)《学习记录》
- 开门人和关门人
- break label和continue label
- 暑假- 动态规划 I-(T - Dividing)
- 数据库之视图、索引
- CAVLC中的前缀和后缀
- scrapy模拟登录微博
- Android 属性系统 Property service 设定分析
- 南阳 oj NYoj 贪心 题目915 +-字符串
- Android实战简易教程-第二十二枪(基于Baas的用户注册功能)
- scrapy模拟登录微博
- C#遍历系统所安装的打印机,使用WMI方式获取打印机的所有属性
- 1、文件ZIp的对byte[]的压缩和解压缩
- HDU 4082 Hou Yi's secret-求相似三角形的最大个数-(坑货)
- postgres修改使用密码登录的方法
- 南阳oj NYOJ 贪心 找点 题目891
- 关于fone的安装
- 多校1 Assignment(枚举 二分 rmq) 1002
- 浏览器的工作机制