HDU4635
/*
最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,
那么要使得边数尽可能的多,则X部肯定是一个完全图,Y部也是,
同时X部中每个点到Y部的每个点都有一条边,假设X部有x个点,
Y部有y个点,有x+y=n,同时边数F=x*y+x*(x-1)+y*(y-1),整理得:F=N*N-N-x*y,
当x+y为定值时,二者越接近,x*y越大,所以要使得边数最多,那么X部和Y部的点数的个数差距就要越大,
所以首先对于给定的有向图缩点,对于缩点后的每个点,如果100它的出度或者入度为0,那么它才有可能成为X部或者Y部,
所以只要求缩点之后的出度或者入度为0的点中,包含节点数最少的那个点,令它为一个部,其它所有点加起来做另一个部,
就可以得到最多边数的图了
*/
/*奶奶个熊的,一定能AC*/
/*PS:加了这句话骂他,居然还AC,果然机器是没有人性的,第一次看了一晚上的tarjan,照着敲了代码,以后加强,睡觉......*/
/*tarjan学习:https://www.byvoid.com/blog/scc-tarjan*/
#include<stdio.h>
#include<string.h>
const int maxn=+;
int per[maxn],lowlink[maxn],scc[maxn],st[maxn];
int index1[maxn],index2[maxn],vis[maxn];
int t1,t2,sccn,top,n,m,dfsn,ans;
struct point
{
int s,t;
int next;
}e[maxn];
struct Nnode
{
int fn,tn;
int num;
}node[maxn];
int min(int a,int b)
{
if(a<b) return a;
return b;
}
void init()
{
memset(per,,sizeof(per));
memset(scc,,sizeof(scc));
memset(lowlink,,sizeof(lowlink));
memset(st,,sizeof(st));
memset(vis,,sizeof(vis));
memset(index1,-,sizeof(index1));
memset(index2,-,sizeof(index2));
dfsn=sccn=top=ans=t1=t2=;
}
void ad1(int s,int t)
{
e[t1].s=s;
e[t1].t=t;
e[t1].next=index1[s];
index1[s]=t1++;
}
void ad2(int s,int t)
{
e[t2].s=s;
e[t2].t=t;
e[t2].next=index1[s];
index1[s]=t2++;
}
void dfs(int u)//tarjan找强连通分量
{
int i;
per[u]=lowlink[u]=++dfsn;
st[top++]=u;
vis[u]=;
for(i=index1[u];i!=-;i=e[i].next)
{
int v=e[i].t;
if(!per[v])
{
dfs(v);
lowlink[u]=min(lowlink[u],lowlink[v]);
}
else if(!scc[v])
lowlink[u]=min(lowlink[u],per[v]);
}
if(lowlink[u]==per[u])
{
int k=;
sccn++;
for(;;)
{
int x=st[--top];
scc[x]=sccn;
k++;
if(x==u)
break;
}
node[sccn].num=k;//记录缩点后的信息
node[sccn].fn=;
node[sccn].tn=;
}
}
void work()
{
int i;
for(i=;i<=n;i++)
if(!vis[i])
dfs(i);
if(sccn==)
{
ans=-;
return;
}
for(i=;i<t1;i++) //缩点后重新建图
{
int u=scc[e[i].s];
int v=scc[e[i].t];
ad2(u,v);
if(u!=v) //不在同一个强连通分量中
{
node[u].tn++;
node[v].fn++;
}
}
int Min=,sum=;
for( i=;i<=sccn;i++)
{
if(node[i].fn==||node[i].tn==)
{
if(Min>node[i].num)
Min=node[i].num;
}
sum+=node[i].num;
}
ans=sum*sum-sum-Min*(sum-Min)-m;
}
int main()
{
int k=;
int t;
int u,v,i;
scanf("%d",&t);
while(t--)
{
init();
scanf("%d%d",&n,&m);
for(i=;i<=m;i++)
{
scanf("%d%d",&u,&v);
ad1(u,v);
}
work();
printf("Case %d: %d\n",++k,ans);
}
return ;
}
HDU4635的更多相关文章
- 强连通(hdu4635)最多增加几条单向边后满足最终的图形不是强连通
Strongly connected Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU-4635 Strongly connected 强连通,缩点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给一个简单有向图(无重边,无自环),要你加最多的边,使得图还是简单有向图... 先判断图是 ...
- hdu4635(强连通缩点)
传送门:Strongly connected 题意:求最多可以加多少边,使得最新的图还不是强连通图. 分析:最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数 ...
- hdu4635(最多加多少边,使得有向图不是强连通图)
连边的最后肯定是两个集合x,yx集合的每个元素,到y集合中的每个元素都是单向的边x集合,和y集合都是完全图设a为x集合的点的个数, b为y集合的那么答案就是 a * b + a*(a-1) + b*( ...
- Strongly connected(hdu4635(强连通分量))
/* http://acm.hdu.edu.cn/showproblem.php?pid=4635 Strongly connected Time Limit: 2000/1000 MS (Java/ ...
- hdu-4635(tarjan缩点)
题意:先给你一个n个点,m条边的有向图,问你最多能够增加多少条边,使得这个图不是一个强连通图 解题思路:考虑最多要添加的边数,所以如果能把初始图划分成两个部分,每个部分都是完全图,这两个部分分别用单向 ...
- [HDU4635] Strongly connected
传送门:>Here< 题意:给出一张DAG,问最多添加几条边(有向)使其强连通分量个数大于1 解题思路 最少添加几条边使其强连通我们是知道的,非常简单,就是入度为0的点与出度为0的点的较大 ...
- HDU4635 Strongly connected【强连通】
题意: 给一个n个点的简单有向图,问最多能加多少条边使得该图仍然是简单有向图,且不是强连通图.简单有向图的定义为:没有重边,无自环. 强连通图的定义为:整个图缩点后就只有一个点,里面包含n个原点,也就 ...
- hdu4635 有向图最多添加多少边使图仍非强连通
思路:先缩点成有向无环图,则必然含有出度为0的点/入度为0的点,因为要使添加的边尽量多,最多最多也就n*(n-1)条减去原来的m条边,这样是一个强连通图,问题转化为最少去掉几条,使图不强连通,原来图中 ...
随机推荐
- js indexof用法indexOf()定义和用法
indexOf()定义和用法 indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置. 语法 stringObject.indexOf(searchvalue,fromindex) ...
- cout显示Mat类对象报错Access Violation
AV(Access Violation)错误:非法访问. image_match.exe 中的 0x0000002a 处有未经处理的异常: 0xC0000005: Access violation 程 ...
- 标C编程笔记day05 函数声明、文件读写、联合类型、枚举类型
函数声明: 1.隐式声明:在没有声明的情况下,系统可依据參数类型推断去调用函数(有可能出错) 2.显式声明:声明在被调用之前.如:double add(double,double); ...
- 一次显式GC导致的High CPU问题处理过程(转)
项目现场反馈系统出现性能问题,具体表现为:所有的客户端响应极其卡顿. 第一反应推测,难道是DB层面出现阻塞?检查v$session会话状态及等待类型未见异常,应该可以排除DB层面原因导致的可能. 继续 ...
- CentOS 安装 dotnetcore
参考官方教程:https://www.microsoft.com/net/core#linuxcentos 安装.NET CORE SDK sudo yum install libunwind lib ...
- [Algorithms] Longest Increasing Subsequence
The Longest Increasing Subsequence (LIS) problem requires us to find a subsequence t of a given sequ ...
- postgresql常用
postgresql 字符串转整数 int.integer --把'1234'转成整数 select cast('1234' as integer ) ; --用substring截取字符串,从第8个 ...
- Linux ping不通百度的解决方法
今天在学习DNS的时候遇到了一个问题,我的虚拟机能够ping通ip地址,却ping不通www.baidu.com www.qq.com等域名,先是出现了以下报错: 折腾了几个小时终于找到解决办法 1. ...
- 手动爬虫之流程笔记1(python3)
一.引入拓展库 由于刚刚起步学习爬虫,故从urllib库开始 首先引入urllib,这里主要用到urllib中request类 import urllib.request as ur 二.设置全局参数 ...
- 如何修改Myeclipse的JSP模板
先找到MyEclipse的安装目录, 再找到myeclipse/eclipse/plugins/com.genuitec.eclipse.wizards_5.1.0/templates/jsp (co ...