HDU4635 Strongly connected
给定一个有向图
求最多可以加多少条边 使加了边以后还是一个有向图而不是强联通图
由于不是一个强连通图,那么至少要有两个连通块。
也就是只有两个连通块时,加的边是最多的。
设有两个连通块
一个里有x个点,另一个里有个y个点
则第一个连通块中的路最多可以使x*(x-1)
第二个连通块中的路最多可以使y*(y-1)
两个连通块之间的路最多可以是(x*y)
那么一共可以连成x * (x-1)+y * (y-1)+x*y条边
又因为x+y=n
那么化简以后就是n*n-n-x*y
那么当x或y是0时 才有可能是答案
也就是找出入度或者出度是0的连通块
然后在减去一开始已经存在m条路
找出max(n*n+n-x*y-m)就是答案
#include<stdio.h> #include<string.h> #include<algorithm>using namespace std;const int maxn = 100005; const int maxm = 100005; int n, m; int top, tol, cnt; int stacksize;struct Node{int u;int v;int next; }; Node node[maxm]; int dfn[maxn]; int low[maxn]; int vis[maxn]; int num[maxn]; int indi[maxn]; int oudi[maxn]; int head[maxn]; int stack[maxn]; int point[maxn];void init() {tol = top = stacksize = cnt = 0;memset(dfn, 0, sizeof(dfn));memset(low, 0, sizeof(low));memset(num, 0, sizeof(num));memset(indi, 0, sizeof(indi));memset(oudi, 0, sizeof(oudi)); memset(node, 0, sizeof(node));memset(head, -1, sizeof(head));memset(vis, false, sizeof(vis));memset(point, 0, sizeof(point));memset(stack, 0, sizeof(stack)); }void addnode(int u, int v) {node[tol].u = u;node[tol].v = v;node[tol].next = head[u];head[u] = tol++; }void dfs(int u) {int v;dfn[u] = low[u] = ++cnt;stack[stacksize++] = u;vis[u] = true;for(int i=head[u]; i!=-1; i=node[i].next) {v = node[i].v;if(!dfn[v]) {dfs(v);low[u] = min(low[u], low[v]);} else if(vis[v]) {low[u] = min(low[u], dfn[v]);}}if(low[u] == dfn[u]) {top++;do{v = stack[--stacksize];vis[v] = false;num[top]++;point[v] = top;} while(v != u);} }void tarjan() {for(int i=1; i<=n; i++) {if(!dfn[i]) {dfs(i);}} }int solve() {for(int u=1; u<=n; u++) {for(int i=head[u]; i+1; i=node[i].next) {int v = node[i].v;if(point[u] != point[v]) {oudi[point[u]]++;indi[point[v]]++;}}}int ans = 0;for(int i=1; i<=top; i++) {if(!oudi[i] || !indi[i]) {ans = max(ans, n*n-n-m-(n-num[i])*num[i]);}}return ans; }int main() {int T;scanf("%d", &T);int cas = 1;while(T--) {init();scanf("%d%d", &n, &m);for(int i=0; i<m; i++) {int u, v;scanf("%d%d", &u, &v);addnode(u, v);}tarjan();if(top == 1) {printf("Case %d: -1\n", cas++);} else {int ans = solve();printf("Case %d: %d\n", cas++, ans);}} }
View Code
转载于:https://www.cnblogs.com/Jiaaaaaaaqi/p/9148314.html
HDU4635 Strongly connected相关推荐
- [HDU4635] Strongly connected
传送门:>Here< 题意:给出一张DAG,问最多添加几条边(有向)使其强连通分量个数大于1 解题思路 最少添加几条边使其强连通我们是知道的,非常简单,就是入度为0的点与出度为0的点的较大 ...
- HDU 4635 Strongly connected(缩点、最多可加边数使得仍然非强连通)
整理的算法模板合集: ACM模板 HDU 4635 Strongly connected Give a simple directed graph with N nodes and M edges. ...
- 【CF913F】Strongly Connected Tournament 概率神题
[CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...
- JavaScript实现strongly Connected Components 强连通分量算法(附完整源码)
JavaScript实现strongly Connected Components 强连通分量算法(附完整源码) Comparator.js完整源代码 LinkedListNode.js完整源代码 L ...
- Strongly connected HDU - 4635(tarjan+强连通分量)
题意: 给一个简单有向图,让你加最多的边,使他还是一个简单有向图. 题目: Give a simple directed graph with N nodes and M edges. Please ...
- 【HDU - 4635】Strongly connected(缩点,新图性质,建图,Tarjan求强连通分量)
题干: Give a simple directed graph with N nodes and M edges. Please tell me the maximum number of the ...
- 数学 {连通性 `Connected`, 强连通性 `Strongly Connected`}
数学 {连通性 Connected, 强连通性 Strongly Connected} 连通性 Connected 定义 设R是定义在X上的齐次二元关系, ( ∀ x 1 ≠ x 2 ∈ X , R ...
- 图论学习六之Strongly connected components强连通分量
强连通分量(Strongly connected cmponents) • 在有向图G中,如果任意两个不同的顶点相互可达,则称该有向 图是强连通的.有向图G的极大强连通子图称为<
- 强连通分量(SCC, Strongly Connected Components)
强连通分量(SCC, Strongly Connected Component) 强连通分量的概念 强连通分量的应用 强连通分量的算法--Tarjan算法 强连通分量的概念 在有向图中,任意两个顶点 ...
- Tarjan's strongly connected components algorithm的一些想法
Tarjan的极大强连通子图(strongly connected components,SCC)算法基于深度优先遍历(DFS)实现.本文就尝试从深度优先遍历的角度思考一下Tarjan的方法是如何找出 ...
最新文章
- Atitit. 脚本语言的断点单步调试的设计与实现 attialx 总结 php 参照java
- golang 生成 解析 json
- server正式的环境性能测试nginx-php 指着寻求突破的表现
- 不要在脱离这个市场的情况下讨论商业模式
- SQL大圣之路笔记——SQL 创建索引 index
- JAVA多线程与并发学习总结
- html range样式修改,自定义(滑动条)input[type=range]样式
- PAIP.彩票系统的对外接口流程实录
- 基于Java Web的学生选课管理系统设计与实现
- 计算机 编程 教程 pdf,[计算机软件及应用]PLC编程基础教程.pdf
- 第十八期 Amesim视频教程热交换器建模仿真专题
- cpuv(cpuv2和v3有什么区别)
- DataCastle[猜你喜欢]赛事算法分享
- 如何构建健商品期carry组合
- 经纬度坐标转为上海地方坐标代码(js代码)
- 直播带货“老三”,抖音背上「KPI」了
- w7点击计算机图标没反应,点击win7系统桌面上的图标没有反应怎么办?
- 全国计算机等级考试三级网络技术选择题考点
- 【Hadoop快速入门】Hdfs、MapReduce、Yarn
- swfobject1.5
热门文章
- pytorch test单张图片_PyTorch的元学习库:Torchmeta
- c++ string substr_【函数分享】PHP函数substr ()分享(2020929)
- linux下查看进程与线程
- android3种播放视频方式,Android 两种方式播放视频
- 怎么添加group_家居装修时,自由装修怎么进行设计,室内怎么改造更合适?
- clion小白使用技巧(持续更新中)
- html制作幸运抽奖,基于canvas的jQuery幸运抽奖大轮盘插件
- ML for trading -cs7646-02
- 为什么必须在主线程操作UI
- 线性可分支持向量机与硬间隔最大化