/*
最终添加完边的图,肯定可以分成两个部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的更多相关文章

  1. 强连通(hdu4635)最多增加几条单向边后满足最终的图形不是强连通

    Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Other ...

  2. HDU-4635 Strongly connected 强连通,缩点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给一个简单有向图(无重边,无自环),要你加最多的边,使得图还是简单有向图... 先判断图是 ...

  3. hdu4635(强连通缩点)

    传送门:Strongly connected 题意:求最多可以加多少边,使得最新的图还不是强连通图. 分析:最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数 ...

  4. hdu4635(最多加多少边,使得有向图不是强连通图)

    连边的最后肯定是两个集合x,yx集合的每个元素,到y集合中的每个元素都是单向的边x集合,和y集合都是完全图设a为x集合的点的个数, b为y集合的那么答案就是 a * b + a*(a-1) + b*( ...

  5. Strongly connected(hdu4635(强连通分量))

    /* http://acm.hdu.edu.cn/showproblem.php?pid=4635 Strongly connected Time Limit: 2000/1000 MS (Java/ ...

  6. hdu-4635(tarjan缩点)

    题意:先给你一个n个点,m条边的有向图,问你最多能够增加多少条边,使得这个图不是一个强连通图 解题思路:考虑最多要添加的边数,所以如果能把初始图划分成两个部分,每个部分都是完全图,这两个部分分别用单向 ...

  7. [HDU4635] Strongly connected

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

  8. HDU4635 Strongly connected【强连通】

    题意: 给一个n个点的简单有向图,问最多能加多少条边使得该图仍然是简单有向图,且不是强连通图.简单有向图的定义为:没有重边,无自环. 强连通图的定义为:整个图缩点后就只有一个点,里面包含n个原点,也就 ...

  9. hdu4635 有向图最多添加多少边使图仍非强连通

    思路:先缩点成有向无环图,则必然含有出度为0的点/入度为0的点,因为要使添加的边尽量多,最多最多也就n*(n-1)条减去原来的m条边,这样是一个强连通图,问题转化为最少去掉几条,使图不强连通,原来图中 ...

随机推荐

  1. 【BZOJ】3432: [Usaco2014 Jan]Cross Country Skiing (bfs+二分)

    http://www.lydsy.com/JudgeOnline/problem.php?id=3432 题目说要相互可达,但是只需要从某个点做bfs然后判断其它点是否可达即可. 原因太简单了.... ...

  2. ASP.NET动态添加控件一例

    第一次单击页面中有3个Label,第二次单击有6个,第三次单击有9个,也就是每次单击要在上次的状态下再添加3个. 我的方法是,可以通过Session来保存上次的状态,一种解法如下: Test.aspx ...

  3. @classmethod装饰器

    当一个类中有多条用例,我们在执行的时候每执行一条用例就要重新打开一次浏览器操作,例如下: start test1 quit start test2 start 若我们使用@classmethod装饰器 ...

  4. Duilib教程-简单介绍

    在读这篇博客的时候,可能您已经对duilib有一定的了解.所以,我并不打算对duilib进行过多的介绍.它的内核首先由外国人编写,后来由国人一个小组接过来继续编写,于是就有了现在的Duilib. 1. ...

  5. 52、图片缩放库 PhotoView

    PhotoView的简介: 这是一个图片查看库,实现图片浏览功能,支持pinch(捏合)手势或者点击放大缩小.支持在ViewPager中翻页浏览图片. PhotoView 是一款扩展自Android ...

  6. xml html xhtml html5

    1.XML 什么是 XML? XML 指可扩展标记语言(EXtensible Markup Language) XML 是一种标记语言,很类似 HTML XML 的设计宗旨是传输数据,而非显示数据 X ...

  7. 【BZOJ4665】小w的喜糖 容斥+组合数

    [BZOJ4665]小w的喜糖 Description 废话不多说,反正小w要发喜糖啦!! 小w一共买了n块喜糖,发给了n个人,每个喜糖有一个种类.这时,小w突发奇想,如果这n个人相互交换手中的糖,那 ...

  8. java如何计算两个经纬度之间的距离?

    /*计算两个经纬度之间的距离 结果单位:米 */public static double getDistance(String lat1Str, String lng1Str, String lat2 ...

  9. PAT 1014 Waiting in Line (模拟)

    1014. Waiting in Line (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue Suppo ...

  10. 天天QA

    w 0-Qphp 在全局范围内访问变量有哪几种方法A2种 <?php$a = 1;$b = 2;var_dump($GLOBALS); <?php$a = 1;$b = 2; functi ...