UVA 10972 - RevolC FaeLoN(边-双连通分量)
UVA 10972 - RevolC FaeLoN
题意:给定一个无向图(不一定全连通)。如今把边定向,问还要加入几条边使得图强连通
思路:先求出边-双连通分量,每一个连通分量都能定向,然后缩点。转化为欧拉回路,假设每一个点度数都是大于等于2的偶数就是回路,也就是强连通了,所以计算度数为0和1的个数。一条边能添加两个度数。所以答案为所以仅仅要再加入上(a + 1) / 2 + b条边就能够了。注意特判一開始就已经是边-双连通分量的情况。答案应该为0
代码:
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std; const int N = 1005; struct Edge {
int u, v, id;
int fan;
bool iscut, used;
Edge() {}
Edge(int u, int v, int id, int fan) {
this->u = u;
this->v = v;
this->id = id;
this->fan = fan;
used = false;
iscut = false;
}
}; int pre[N], low[N], dfs_clock; vector<Edge> g[N];
vector<Edge> cut; int dfs(int u, int fa) {
int lowu = pre[u] = ++dfs_clock;
for (int i = 0; i < g[u].size(); i++) {
int v = g[u][i].v;
int id = g[u][i].id;
if (id == fa) continue;
if (!pre[v]) {
int lowv = dfs(v, id);
lowu = min(lowu, lowv);
if (lowv > pre[u]) {
cut.push_back(g[u][i]);
g[u][i].iscut = true;
g[v][g[u][i].fan].iscut = true;
}
} else lowu = min(lowu, pre[v]);
}
return low[u] = lowu;
} int bcc_cnt, bccno[N]; void dfs2(int u, int bcc_cnt) {
bccno[u] = bcc_cnt;
for (int i = 0; i < g[u].size(); i++) {
if (g[u][i].iscut) continue;
int v = g[u][i].v;
if (bccno[u] == bccno[v]) continue;
dfs2(v, bcc_cnt);
}
} void find_cut(int n) {
cut.clear();
memset(pre, 0, sizeof(pre));
dfs_clock = 0;
for (int i = 0; i < n; i++) {
if (!pre[i]) {
dfs(i, 0);
}
}
} void find_bcc(int n) {
find_cut(n);
bcc_cnt = 0;
memset(bccno, 0, sizeof(bccno));
for (int i = 0; i < n; i++) {
if (bccno[i]) continue;
dfs2(i, ++bcc_cnt);
}
} int n, m, du[N]; int main() {
while (~scanf("%d%d", &n, &m)) {
for (int i = 0; i < n; i++) g[i].clear();
int u, v;
for (int i = 1; i <= m; i++) {
scanf("%d%d", &u, &v);
u--; v--;
g[u].push_back(Edge(u, v, i, g[v].size()));
g[v].push_back(Edge(v, u, i, g[u].size() - 1));
}
find_bcc(n);
if (bcc_cnt == 1) {
printf("0\n");
continue;
}
memset(du, 0, sizeof(du));
for (int i = 0; i < cut.size(); i++) {
int u = cut[i].u, v = cut[i].v;
if (bccno[u] != bccno[v]) {
du[bccno[u]]++; du[bccno[v]]++;
}
}
int a = 0, b = 0;
for (int i = 1; i <= bcc_cnt; i++) {
if (du[i] == 1) a++;
if (du[i] == 0) b++;
}
printf("%d\n", (a + 1) / 2 + b);
}
return 0;
}
UVA 10972 - RevolC FaeLoN(边-双连通分量)的更多相关文章
- UVA 10972 RevolC FaeLoN(边连通分量)
坑了我一天的题目..跑了20ms挂了,就知道有个小毛病= = 无向图转有向图判强连通. 首先要知道什么样的无向图可以转化为强连通图?连通分量(环)自然是可以的:那么扩大范围(存在割顶),发现点连通分量 ...
- UVA 10972 RevolC FaeLoN(边-双连通+缩点)
很好的一道图论题,整整撸了一上午... 题意是给定一个无向图,要求将所有边变为有向边,求最少加入多少条有向边,使得该图强连通?这里先假设一个问题:给定一个无向子图,该子图具有怎样的性质才能使得将其无向 ...
- uva 10972 RevolC FaeLoN cdoj 方老师和农场
//自己写的第一发tarjan 解:先进行双连通分解并缩点,分解后一定是一颗树,设叶节点个数为n那么答案就是(n+1)/2 关于双连通分量求解:在跑tarjan时判断每个点连向父节点的边是否是桥,如果 ...
- UVA - 10972 RevolC FaeLoN
一道特别好的题qwq. 题目大意就是给你一个无向图,让你把边定向之后再加一些边使得这个图强连通,求最少需要加多少边. 一开始毫无头绪23333,数据范围让人摸不着头脑..... 然后开始画图,,,发现 ...
- uva 10972(边双连通分量)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33804. 思路:和poj的一道题有点像,不过这道题图可能不连通,因 ...
- 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)
layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...
- UVA 10765 Doves and bombs(双连通分量)
题意:在一个无向连通图上,求任意删除一个点,余下连通块的个数. 对于一个非割顶的点,删除之后,原图仍连通,即余下连通块个数为1:对于割顶,余下连通块个数>=2. 由于是用dfs查找双连通分量,树 ...
- UVA-10972 RevolC FaeLoN (边双连通+缩点)
题目大意:将n个点,m条边的无向图变成强连通图,最少需要加几条有向边. 题目分析:所谓强连通,就是无向图中任意两点可互达.找出所有的边连通分量,每一个边连通分量都是强连通的,那么缩点得到bcc图,只需 ...
- LA 3523 圆桌骑士(二分图染色+点双连通分量)
https://vjudge.net/problem/UVALive-3523 题意: 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置 ...
随机推荐
- Java从零开始学二十二(集合Set接口)
一.Set接口的定义 Set接口也是Collection接口的子接口,但是与Collection或List接口不同的是,Set接口中不能加入重复的元素 Set接口的主要方法与Collection是一致 ...
- linux下查看线程数的几种方法
1. cat /proc/${pid}/status 2.pstree -p ${pid} 3.top -p ${pid} 再按H 或者直接输入 top -bH -d 3 -p ${pid} t ...
- zookeeper技术浅析
Zookeeper是hadoop的一个子项目,尽管源自hadoop,可是我发现zookeeper脱离hadoop的范畴开发分布式框架的运用越来越多. 今天我想谈谈zookeeper.本文不谈如何使用z ...
- VS2015 正式版中为什么没有了函数前面引用提示了?
HttpClient _httpClient = new HttpClient(); var clientId = Config.GetValue("AuthUser"); var ...
- opencv实现gamma灰阶检測
简单介绍 本篇解说使用opencv来測试,表示camera gamma參数的灰阶卡图片指标:YA Block.DynamicRange.Gray Scale. 详细实现 实现代码 #include & ...
- servlet常用操作
servlet常用操作 CreateTime--2017年9月7日09:36:43 Author:Marydon 1.获取当前应用程序对象 需要导入: import javax.servlet.S ...
- 【Docker】常用命令
1.查看正在运行的容器 [root@localhost ~]# docker ps CONTAINER ID IMAGE COMMAND ...
- Oracle执行SQL报错ORA-00922
问题描述: 对Oracle数据库执行序列化脚本出错,ora-00922 missing or invalid option #无效的选项 问题解决: 对于set define off --这个是sq ...
- Java多线程中run(), start(), join(), wait(), yield(), sleep()的使用
Run 每个Thread中需要实现的方法, 如果直接调用的话, 会是和单线程一样的效果, 要另起线程需要使用start(). start 新起线程调用run(). 主线程不等待直接往下执行 Yield ...
- android-使用环信SDK开发即时通信功能及源代码下载
近期项目中集成即时聊天功能.挑来拣去,终于选择环信SDK来进行开发,选择环信的主要原因是接口方便.简洁.说明文档清楚易懂.文档有android.ios.和后台server端.还是非常全的. 环信官网: ...