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条边,这样是一个强连通图,问题转化为最少去掉几条,使图不强连通,原来图中 ...
随机推荐
- noip 模拟赛 After 17(递推+特殊的技巧)
来源:Violet_II T1 好神的一题,我竟然没做出来QAQ 首先我们发现,答案是sigma(x[i]*x[j], i>j)+sigma(y[i]*y[j], i>j).显然只需要讨论 ...
- sql语句中3表删除和3表查询
好久没来咱们博客园了,主要近期在忙一些七七八八的杂事,包括打羽毛球比赛的准备和自己在学jqgrid的迷茫.先不扯这些没用的了,希望大家能记得小弟,小弟在此谢过大家了. 回归正题:(以下的sql是本人在 ...
- 20个JS 小技巧超级实用
1. 将彻底屏蔽鼠标右键 oncontextmenu=”window.event.returnValue=false” < table border oncontextmenu=return(f ...
- 拦截asp.net输出流并进行处理的方法
本文实例主要实现对已经生成了HTML的页面做一些输出到客户端之前的处理. 方法的实现原理是:把Response的输出重定向到自定义的容器内,也就是我们的StringBuilder对象里,在HTML所有 ...
- SurvivalShooter学习笔记(一.相机跟随)
1.场景碰撞已好,地板需建一Quad去掉渲染留下碰撞,设置layer为Floor:用于建立摄像机朝向地面的射线,确定鼠标停留点,确定主角需要的朝向. 2.设置摄像机跟随主角: 本例中摄像机设置为正交模 ...
- simpson公式求定积分(模板)
#include<cstdio> #include<cmath> #include <algorithm> using namespace std; double ...
- 【BZOJ3875】[Ahoi2014&Jsoi2014]骑士游戏 SPFA优化DP
[BZOJ3875][Ahoi2014&Jsoi2014]骑士游戏 Description [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会扮演一个英勇的 ...
- 从global到mooncake迁移SQL Azure
之前遇到了问题,在此备注一下: 因为两个环境基本上可以认为是隔离的,所以迁移过程基本上只有通过导出.导入的方式(也是官方推荐的方式): 1.从global上进行数据库的export操作(扩展名bacp ...
- 浅谈数据库并发控制 - 锁和 MVCC
在学习几年编程之后,你会发现所有的问题都没有简单.快捷的解决方案,很多问题都需要权衡和妥协,而本文介绍的就是数据库在并发性能和可串行化之间做的权衡和妥协 - 并发控制机制. 如果数据库中的所有事务都是 ...
- Powershell About Active Directory Group Membership of a domain user
使用Get-User命令去寻找group membership of a domain user $((Get-ADUser Wendy -Properties *).MemberOf -split ...