/*
最终添加完边的图,肯定可以分成两个部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. 可以输入也可以下拉选择的select

    网址:http://www.helloweba.com/view-blog-348.html 示例:http://www.helloweba.com/demo/2016/editable-select ...

  2. (一)Spring容器相关操作

    一.spring事件 spring的事件有如下两个成员. 1.ApplicationEvent,容器事件,由容器发布 2.ApplicationListener 监听器,可以由容器中的任何监听器Bea ...

  3. JDB调试之小试牛刀

    用JDK自带工具JDB调试示例程序HelloJDB(d:\jdb\HelloJDB) HelloJDB代码如下: public class HelloJDB { public static void ...

  4. 使用phpnow本地搭建Discuz!如何实现伪静态

    用phpnow本地搭建Discuz!如何实现伪静态 因为phpnow本身就支持伪静态,那只要看下相关的设置是否正确,写个.htaccess的文件就可以了. 一.确认httpd.conf的设置 在xxx ...

  5. 两天学会DirectX 3D之第二天

    提要 前几天非常easy地跑了一个DirectX 9 程序,以为DirectX就那么绘制,事实证明有点Naive了. 之前的那个程序最多也就是个固定流水线的东西. 可是今天要用DirectX11来写一 ...

  6. Linux下的Make与Makefile

    原文转载自:http://www.cpplive.com/html/1776.html 另外一个不错的博客http://bbs.chinaunix.net/thread-1950588-1-1.htm ...

  7. fis3解决web网站缓存问题

    为什么使用FIS3 项目上线一段时间后如果更新JS或CSS文件,而客户端已经对该文件缓存过了,那就有可能会无法及时更新而继续采用旧的JS或CSS文件,无法达到想要的效果. 处理类似情况最有效的解决方案 ...

  8. location.assign 与 location.replace的区别

    window.location.assign(url) : 加载 URL 指定的新的 HTML 文档. 就相当于一个链接,跳转到指定的url,当前页面会转为新页面内容,可以点击后退返回上一个页面. w ...

  9. cocos2d-X学习之主要类介绍:布景:CCLayer

    类继承图:  CCLayer 是CCNode的子类 ,实现了TouchEventsDelegate接口,继承了CCNode所有的特性,并且附加了一些自己的特性,它能够接收iPhone的触摸事件,也能够 ...

  10. 160801、BlockingQueue处理多线程

    前面介绍过spring的taskExecutor,今天介绍一个jdk里处理多线程的方法 一.spring的配置文件(注入bean) <bean id="cmsClickButtonMn ...