kuangbin专题 专题九 连通图 Strongly connected HDU - 4635
题目链接:https://vjudge.net/problem/HDU-4635
题目:有向图,给定若干个连通图,求最多还能添加几条边,添完边后,图仍然要满足
(1)是简单图,即没有重边或者自环
(2)不是有向强连通图
思路:我们可以这么想,n个顶点,一个有向图边数最多,就是有向完全图,则边数为n*(n-1)。
要满足不是强连通图,我们可以假设有一个tarjan缩成的点(scc),它不能到达其他所有点,或者其他所有点
不能到达它,假设这个scc有k个顶点,也就是说,k*(n-k)条边是不存在的,那么最大添加边数应该是 n*(n-1) - k*(n-k) - m(本来有的边) ---- ①
给定的图情况不确定,我们先进行tarjan缩点,分成若干个scc,每个scc中也记录各自scc中的顶点数,然后进行scc的入度出度统计。
为使添加的边能最多,我们选所有的入度为0或者出度为0的scc 套入 公式①,选最大即可。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std; typedef long long ll;
const int N = (int)1e5+;
int n,m,tot,tim,scc,top;
int head[N],dfn[N],low[N],scc_no[N],s[N],ins[N];
struct node{
int to;
int nxt;
}e[N];
struct col{
int ru;
int chu;
int cnt;
}col[N];//强连通分量 void init(){
for(int i = ; i <= n; ++i){
head[i] = -;
col[i].ru = col[i].chu = dfn[i] = ;
}
tot = tim = scc = ;
} inline void add(int u,int v){
e[tot].to = v;
e[tot].nxt = head[u];
head[u] = tot++;
} void tarjan(int now,int pre){
dfn[now] = low[now] = ++tim;
ins[now] = ; s[top++] = now;
int to;
for(int o = head[now]; ~o; o = e[o].nxt){
to = e[o].to;
// if(to == pre) continue;
if(!dfn[to]){
tarjan(to,now);
low[now] = min(low[now],low[to]);
}
else if(ins[to]) low[now] = min(low[now],dfn[to]);
} if(dfn[now] == low[now]){
int x,cnt = ;
++scc;
do{
x = s[--top];
ins[x] = ;
scc_no[x] = scc;
++cnt;
}while(now != x);
col[scc].cnt = cnt;//每个强连通分量包含几个点
}
} //入度出度统计
void du_cnt(){
int to;
for(int now = ; now <= n; ++now){
for(int o = head[now]; ~o; o = e[o].nxt){
to = e[o].to;
if(scc_no[to] == scc_no[now]) continue;
++col[scc_no[to]].ru;
++col[scc_no[now]].chu;
}
}
} void solve(int _case){
for(int i = ; i <= n; ++i)
if(!dfn[i]) tarjan(i,i); ll ans = (ll)n*(n-) - m;
ll useless = (1LL) << ;
du_cnt();
for(int i = ; i <= scc; ++i){
if(!col[i].ru || !col[i].chu){
useless = min(useless,(ll)col[i].cnt*(n-col[i].cnt));
}
}
if(scc == ) printf("Case %d: -1\n",_case);
else printf("Case %d: %lld\n",_case,ans-useless);
} int main(){ int T,u,v;
scanf("%d",&T);
for(int i = ; i <= T; ++i){
scanf("%d%d",&n,&m);
init();
for(int x = ; x <= m; ++x){
scanf("%d%d",&u,&v);
add(u,v);
}
solve(i);
} return ;
}
kuangbin专题 专题九 连通图 Strongly connected HDU - 4635的更多相关文章
- Strongly connected HDU - 4635(判断强连通图 缩点)
找出强联通块,计算每个连通块内的点数.将点数最少的那个连通块单独拿出来,其余的连通块合并成一个连通分量. 那么假设第一个连通块的 点数是 x 第二个连通块的点数是 y 一个强连通图(每两个点之间,至 ...
- Strongly connected HDU - 4635 原图中在保证它不是强连通图最多添加几条边
1 //题意: 2 //给你一个有向图,如果这个图是一个强连通图那就直接输出-1 3 //否则,你就要找出来你最多能添加多少条边,在保证添加边之后的图依然不是一个强连通图的前提下 4 //然后输出你最 ...
- G - Strongly connected - hdu 4635(求连通分量)
题意:给你一个图,问最多能添加多少条边使图仍为不是强连通图,如果原图是强连通输出 ‘-1’ 分析:先把求出连通分量进行缩点,因为是求最多的添加边,所以可以看成两部分 x,y,只能一部分向另外一部分连边 ...
- 强连通图(最多加入几条边使得图仍为非强连通图)G - Strongly connected HDU - 4635
题目链接:https://cn.vjudge.net/contest/67418#problem/G 具体思路:首先用tarjan缩点,这个时候就会有很多个缩点,然后再选取一个含有点数最少,并且当前这 ...
- kuangbin专题 专题九 连通图 Warm up HDU - 4612
题目链接:https://vjudge.net/problem/HDU-4612 题目:一个大地图,给定若干个连通图,每个连通图中有若干个桥,你可以在任意某个连通图的 任意两个点添加一条边,问,添加一 ...
- [kuangbin带你飞]专题九 连通图
ID Origin Title 76 / 163 Problem A POJ 1236 Network of Schools 59 / 177 Problem B UVA 315 Ne ...
- 「kuangbin带你飞」专题十九 矩阵
layout: post title: 「kuangbin带你飞」专题十九 矩阵 author: "luowentaoaa" catalog: true tags: mathjax ...
- 给自己的小练习19-[kuangbin带你飞]专题九连通图
没有写题解.补一波 Network of Schools 问题1:求有向图中入度为0的点个数 问题2:使得整个图变成一个联通分量 问题1直接缩点统计 问题2=max(入度为0的点,出度为0的点),注意 ...
- HDU 4635 Strongly connected (2013多校4 1004 有向图的强连通分量)
Strongly connected Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
随机推荐
- 添加gitignore文件后使其生效
https://www.cnblogs.com/AliliWl/p/7880243.html 遇到的问题 我们发现在添加.gitignore文件后,当我们想push文件的时候,我们声明的忽略文件还是会 ...
- git学习六:git提交忽略不必要的文件或文件夹
创建maven项目,使用git提交,有时需要忽略不必要的文件或文件夹,只保留一些基本. 例如如下截图,实际开发中我们只需提交:src,.gitignore,pom.xml 而自己项目文件一般都保留,但 ...
- python模块之random模块
random模块 随机模块,用于处理随机问题. import random # 随机整数 print(random.randint(0, 9)) # 0到9之间随机一个整数 print(random. ...
- P1086 最大素数积
题目描述 我们称一个整数 \(x\) 是"素数积"当且仅当 \(x = a \times b\) 并且 \(a\) 和 \(b\) 都是素数. 现在告诉你一个数 \(N(1 \le ...
- Linux 内核 设备结构嵌入
设备结构包含设备模型核心需要的来模型化系统的信息. 大部分子系统, 但是, 跟踪关于 它们驻留的设备的额外信息. 结果, 对设备很少由空设备结构所代表; 相反, 这个结构, 如同 kobject 结构 ...
- FineReport报表和水晶报表的比较
FineReport报表和水晶报表的比较 FineReport报表软件针对复杂格式的报表数据及Web报表的展现,通过多源分片.不规则分组.双向扩展来轻松拖拽做复杂格式的报表,制作报表从此摆脱了复杂的S ...
- Team Foundation Server 2015使用教程【10】:团队项目删除
- Math类入门学习
Math类 Math类包含用于执行基本的数字运算等基本指数.对数.平方根法.三角函数. import java.lang.*; public class TestMath { public stati ...
- 在Linux CentOS下如何安装tar.gz和RPM软件包
1.安装tar.gz软件包: 在Linuxr(Centos下)如何安装tar.gz软件包,该方式实质上就是源代码安装方式,具体如下: 在Linux中使用wget命令下载要安装的文件,命令格式如下:wg ...
- VisitorPattern(访问者模式)-----Java/.Net
在访问者模式(Visitor Pattern)中,我们使用了一个访问者类,它改变了元素类的执行算法.通过这种方式,元素的执行算法可以随着访问者改变而改变.这种类型的设计模式属于行为型模式.根据模式,元 ...