给定一个有向图 
求最多可以加多少条边 使加了边以后还是一个有向图而不是强联通图 
由于不是一个强连通图,那么至少要有两个连通块。 
也就是只有两个连通块时,加的边是最多的。 
设有两个连通块 
一个里有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相关推荐

  1. [HDU4635] Strongly connected

    传送门:>Here< 题意:给出一张DAG,问最多添加几条边(有向)使其强连通分量个数大于1 解题思路 最少添加几条边使其强连通我们是知道的,非常简单,就是入度为0的点与出度为0的点的较大 ...

  2. HDU 4635 Strongly connected(缩点、最多可加边数使得仍然非强连通)

    整理的算法模板合集: ACM模板 HDU 4635 Strongly connected Give a simple directed graph with N nodes and M edges. ...

  3. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

  4. JavaScript实现strongly Connected Components 强连通分量算法(附完整源码)

    JavaScript实现strongly Connected Components 强连通分量算法(附完整源码) Comparator.js完整源代码 LinkedListNode.js完整源代码 L ...

  5. Strongly connected HDU - 4635(tarjan+强连通分量)

    题意: 给一个简单有向图,让你加最多的边,使他还是一个简单有向图. 题目: Give a simple directed graph with N nodes and M edges. Please ...

  6. 【HDU - 4635】Strongly connected(缩点,新图性质,建图,Tarjan求强连通分量)

    题干: Give a simple directed graph with N nodes and M edges. Please tell me the maximum number of the ...

  7. 数学 {连通性 `Connected`, 强连通性 `Strongly Connected`}

    数学 {连通性 Connected, 强连通性 Strongly Connected} 连通性 Connected 定义 设R是定义在X上的齐次二元关系, ( ∀ x 1 ≠ x 2 ∈ X , R ...

  8. 图论学习六之Strongly connected components强连通分量

    强连通分量(Strongly connected cmponents) • 在有向图G中,如果任意两个不同的顶点相互可达,则称该有向   图是强连通的.有向图G的极大强连通子图称为<

  9. 强连通分量(SCC, Strongly Connected Components)

    强连通分量(SCC, Strongly Connected Component) 强连通分量的概念 强连通分量的应用 强连通分量的算法--Tarjan算法 强连通分量的概念 在有向图中,任意两个顶点 ...

  10. Tarjan's strongly connected components algorithm的一些想法

    Tarjan的极大强连通子图(strongly connected components,SCC)算法基于深度优先遍历(DFS)实现.本文就尝试从深度优先遍历的角度思考一下Tarjan的方法是如何找出 ...

最新文章

  1. Atitit. 脚本语言的断点单步调试的设计与实现 attialx 总结 php 参照java
  2. golang 生成 解析 json
  3. server正式的环境性能测试nginx-php 指着寻求突破的表现
  4. 不要在脱离这个市场的情况下讨论商业模式
  5. SQL大圣之路笔记——SQL 创建索引 index
  6. JAVA多线程与并发学习总结
  7. html range样式修改,自定义(滑动条)input[type=range]样式
  8. PAIP.彩票系统的对外接口流程实录
  9. 基于Java Web的学生选课管理系统设计与实现
  10. 计算机 编程 教程 pdf,[计算机软件及应用]PLC编程基础教程.pdf
  11. 第十八期 Amesim视频教程热交换器建模仿真专题
  12. cpuv(cpuv2和v3有什么区别)
  13. DataCastle[猜你喜欢]赛事算法分享
  14. 如何构建健商品期carry组合
  15. 经纬度坐标转为上海地方坐标代码(js代码)
  16. 直播带货“老三”,抖音背上「KPI」了
  17. w7点击计算机图标没反应,点击win7系统桌面上的图标没有反应怎么办?
  18. 全国计算机等级考试三级网络技术选择题考点
  19. 【Hadoop快速入门】Hdfs、MapReduce、Yarn
  20. swfobject1.5

热门文章

  1. pytorch test单张图片_PyTorch的元学习库:Torchmeta
  2. c++ string substr_【函数分享】PHP函数substr ()分享(2020929)
  3. linux下查看进程与线程
  4. android3种播放视频方式,Android 两种方式播放视频
  5. 怎么添加group_家居装修时,自由装修怎么进行设计,室内怎么改造更合适?
  6. clion小白使用技巧(持续更新中)
  7. html制作幸运抽奖,基于canvas的jQuery幸运抽奖大轮盘插件
  8. ML for trading -cs7646-02
  9. 为什么必须在主线程操作UI
  10. 线性可分支持向量机与硬间隔最大化