博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU4635 Strongly connected
阅读量:5330 次
发布时间:2019-06-14

本文共 2467 字,大约阅读时间需要 8 分钟。

给定一个有向图 

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

 

转载于:https://www.cnblogs.com/Jiaaaaaaaqi/p/9148314.html

你可能感兴趣的文章
PHP zip压缩文件及解压
查看>>
SOAP web service用AFNetWorking实现请求
查看>>
Java变量类型,实例变量 与局部变量 静态变量
查看>>
mysql操作命令梳理(4)-中文乱码问题
查看>>
Python环境搭建(安装、验证与卸载)
查看>>
一个.NET通用JSON解析/构建类的实现(c#)
查看>>
Windows Phone开发(5):室内装修 转:http://blog.csdn.net/tcjiaan/article/details/7269014
查看>>
详谈js面向对象 javascript oop,持续更新
查看>>
关于这次软件以及pda终端的培训
查看>>
jQuery上传插件Uploadify 3.2在.NET下的详细例子
查看>>
如何辨别一个程序员的水平高低?是靠发量吗?
查看>>
新手村之循环!循环!循环!
查看>>
正则表达式的用法
查看>>
线程安全问题
查看>>
SSM集成activiti6.0错误集锦(一)
查看>>
下拉刷新
查看>>
linux的子进程调用exec( )系列函数
查看>>
MSChart的研究
查看>>
C# 索引器
查看>>
MySQLdb & pymsql
查看>>