HDU 2767:Proving Equivalences(强连通)
题意:
一个有向图,问最少加几条边,能让它强连通
方法:
1:tarjan 缩点
2:采用如下构造法:
缩点后的图找到所有头结点和尾结点,那么,可以这么构造:把所有的尾结点连一条边到头结点,就必然可以是强连通了。如果说有几个结点不连通,那么让他们的尾结点相互只向对方的头结点就好了。
那么,最后的答案就是,头结点和尾结点中比较小的那个数量。
当然,如果缩点后只有一个点,那么就是0;
代码:
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std;
#define N 20010
using namespace std;
vector <int> to[N];
vector <int> g[N];
int in[N], out[N];
//#define vii vector<int>iterator;
int low[N], dep[N], id[N], s[N], top, scnt, cnt;
int n, m;
void tarinit() {
top = cnt = scnt = ;
memset(dep, -, sizeof(dep));
} void tarjan(int u) {
int minc = low[u] = dep[u] = cnt++;
s[top++] = u;
int end = to[u].size();
for (int i = ; i < end; i++) {
if (dep[to[u][i]] == -) tarjan(to[u][i]);
if (minc > low[to[u][i]]) minc = low[to[u][i]];
}
if (minc < low[u]) low[u] = minc;
else {
while (s[top] != u){
id[s[--top]] = scnt;
low[s[top]] = n+;
}
scnt++;
}
} int main() {
int t;
scanf("%d", &t);
while (t--) {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) to[i].clear(), g[i].clear();
for (int i = ; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
to[u].push_back(v);
}
tarinit();
for (int i = ; i <= n; i++) {
if (dep[i] == -) {
tarjan(i);
}
}
memset(out,,sizeof(out));
memset(in,,sizeof(in));
for (int i = ; i <= n; i++) {
int end = to[i].size();
for (int j = ; j < end; j++) {
if (id[i] != id[to[i][j]]) {
out[id[i]]++;
in[id[to[i][j]]]++;
}
}
}
if (scnt == ) {
puts("");
continue;
}
int root = ;
int leaf = ;
for (int i = ; i < scnt; i++) {
if (out[i] == ) leaf++;
if (in[i] == ) root++;
}
printf("%d\n", max(root,leaf));
}
return ;
}
HDU 2767:Proving Equivalences(强连通)的更多相关文章
- hdu 2767 Proving Equivalences 强连通缩点
给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...
- HDU 2767 Proving Equivalences(强连通 Tarjan+缩点)
Consider the following exercise, found in a generic linear algebra textbook. Let A be an n × n matri ...
- HDU 2767 Proving Equivalences (强联通)
pid=2767">http://acm.hdu.edu.cn/showproblem.php?pid=2767 Proving Equivalences Time Limit: 40 ...
- hdu 2767 Proving Equivalences
Proving Equivalences 题意:输入一个有向图(强连通图就是定义在有向图上的),有n(1 ≤ n ≤ 20000)个节点和m(0 ≤ m ≤ 50000)条有向边:问添加几条边可使图变 ...
- HDU 2767 Proving Equivalences(至少增加多少条边使得有向图变成强连通图)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 2767 Proving Equivalences (Tarjan)
Proving Equivalences Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other ...
- hdu - 2667 Proving Equivalences(强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=2767 求至少添加多少条边才能变成强连通分量.统计入度为0的点和出度为0的点,取最大值即可. #include & ...
- hdu 2767 Proving Equivalences(tarjan缩点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2767 题意:问最少加多少边可以让所有点都相互连通. 题解:如果强连通分量就1个直接输出0,否者输出入度 ...
- hdoj 2767 Proving Equivalences【求scc&&缩点】【求最少添加多少条边使这个图成为一个scc】
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
随机推荐
- 【线段树合并】bzoj3545: [ONTAK2010]Peaks
1A还行 Description 在Bytemountains有N座山峰,每座山峰有他的高度h_i.有些山峰之间有双向道路相连,共M条路径,每条路径有一个困难值,这个值越大表示越难走,现在有Q组询问, ...
- UVa 12171 题解
英文题面不怎么友好,大家还是自行通过紫书了解题面吧... 解题思路: 1. 面对500 ^ 3的数据范围,我们需要先用离散化解决掉爆空间的问题. 2. 由于我们要求的总体积包括内空部分的体积,我们可以 ...
- 洛谷 2023 [AHOI2009]维护序列
洛谷 2023 [AHOI2009]维护序列 洛谷原题传送门 这个题也是一道经典的线段树模版(其实洛谷的模版二改一下输入顺序就能AC),其中包括区间乘法修改.区间加法修改.区间查询三个操作. 线段树的 ...
- matlplotlib绘图(二)
matplotlib基础知识 matpltlib中的基本图表包括的元素 1.x轴和y轴:水平和垂直的轴线 2.x轴和y轴的刻度:刻度标识坐标值的分隔,包括最小刻度和最大刻度 3.x轴和y轴刻度:表示特 ...
- LeetCode935
问题:935. 骑士拨号器 国际象棋中的骑士可以按下图所示进行移动: . 这一次,我们将 “骑士” 放在电话拨号盘的任意数字键(如上图所示)上,接下来,骑士将会跳 N-1 步. ...
- http客户端与浏览器的区别
两者区别:浏览器对http响应头会进行特定处理(如自动读取本地缓存.设置cookie等),而http客户端(如crul)可能没有像浏览器那样的处理,某些封装程度高的http客户端,可能会有. 同一个文 ...
- python里字典的用法介绍
一.什么是字典 字典是python里的一种数据类型,特点是元素的无序性,和键key的唯一性.字典的创建方法是{key:values},字典里的键key只能是不可变的数据类型(整型,字符串或者是元组), ...
- bootmem_init_node
static unsigned long __init bootmem_init_node(int node, struct meminfo *mi) in arch/arm/mm/init.c 1. ...
- ssl 在nginx上的部署示例
server { listen 80; listen 443 ssl; server_name [DOMAIN]; ssl on; ssl_certificate /work/ss ...
- Python 基础(一)
本章内容 1.编译和解释型语言的区别 2.Python的解释器 3.pyc文件 4.运行环境 5.变量 6.数据类型 7.字符编码 8.三元运算 编译和解释型语言的区别 编译器是把源程序的每一条语句都 ...