题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635

  题意:给一个简单有向图(无重边,无自环),要你加最多的边,使得图还是简单有向图。。。

  先判断图是否强连通。如果不是强连通的,那么缩点。我们的目的是加最多的边,那么最后的图中,肯定两个集合,这两个集合都是强联通的,一个集合到一个集合只有单向边。我们先让图是满图,然后通过删边来求的:有n*(n-1)条边,然后删掉已有的边m,然后还有删掉两个集合的边n1*(n-n1),n1为其中一个集合的顶点个数,因为这里是单向边。那么答案就是ans=n*(n-1)-m-n1*(n-n1),我们要使ans最大,那么n1*(n-n1)就要越小,则n1最小,就是缩点后一个点的情况,枚举下就行了。。。  n1*(n-n1)为二次凸函数,然后枚举找n1*(n-n1)的最小值就可以了。我直接找 n1最小居然过了><,数据真弱。。。

 //STATUS:C++_AC_46MS_3488KB
#include <functional>
#include <algorithm>
#include <iostream>
//#include <ext/rope>
#include <fstream>
#include <sstream>
#include <iomanip>
#include <numeric>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <string>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
//#pragma comment(linker,"/STACK:102400000,102400000")
//using namespace __gnu_cxx;
//define
#define pii pair<int,int>
#define mem(a,b) memset(a,b,sizeof(a))
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define PI acos(-1.0)
//typedef
typedef __int64 LL;
typedef unsigned __int64 ULL;
//const
const int N=;
const int INF=0x3f3f3f3f;
const int MOD=,STA=;
const LL LNF=1LL<<;
const double EPS=1e-;
const double OO=1e15;
const int dx[]={-,,,};
const int dy[]={,,,-};
const int day[]={,,,,,,,,,,,,};
//Daily Use ...
inline int sign(double x){return (x>EPS)-(x<-EPS);}
template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;}
template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;}
template<class T> inline T lcm(T a,T b,T d){return a/d*b;}
template<class T> inline T Min(T a,T b){return a<b?a:b;}
template<class T> inline T Max(T a,T b){return a>b?a:b;}
template<class T> inline T Min(T a,T b,T c){return min(min(a, b),c);}
template<class T> inline T Max(T a,T b,T c){return max(max(a, b),c);}
template<class T> inline T Min(T a,T b,T c,T d){return min(min(a, b),min(c,d));}
template<class T> inline T Max(T a,T b,T c,T d){return max(max(a, b),max(c,d));}
//End struct Edge{
int u,v;
}e[N];
int first[N],next[N],pre[N],sccno[N],low[N];
int n,mt,dfs_clock,scnt;
stack<int> s; int cntn[N],in[N],out[N];
int T,m; void adde(int a,int b)
{
e[mt].u=a;e[mt].v=b;
next[mt]=first[a],first[a]=mt++;
} void dfs(int u)
{
int i,j,v;
pre[u]=low[u]=++dfs_clock;
s.push(u);
for(i=first[u];i!=-;i=next[i]){
v=e[i].v;
if(!pre[v]){
dfs(v);
low[u]=Min(low[u],low[v]);
}
else if(!sccno[v]){ //反向边更新
low[u]=Min(low[u],low[v]);
}
}
if(low[u]==pre[u]){ //存在强连通分量
int x=-;
scnt++;
while(x!=u){
x=s.top();s.pop();
sccno[x]=scnt;
}
}
} void find_scc()
{
int i;
mem(pre,);mem(sccno,);
scnt=dfs_clock=;
for(i=;i<=n;i++){
if(!pre[i])dfs(i);
}
} int main(){
// freopen("in.txt","r",stdin);
int ca=,i,j,a,b,cnt;
LL ans;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
mem(first,-);mt=;
for(i=;i<m;i++){
scanf("%d%d",&a,&b);
adde(a,b);
} find_scc();
printf("Case %d: ",ca++);
if(scnt==){
printf("-1\n");
continue;
}
mem(cntn,);
mem(in,);mem(out,);
for(i=;i<=n;i++)cntn[sccno[i]]++;
for(i=;i<mt;i++){
if(sccno[e[i].u]!=sccno[e[i].v]){
in[sccno[e[i].v]]++;
out[sccno[e[i].u]]++;
}
}
ans=;
int low=INF;
for(i=;i<=scnt;i++){
if(in[i]== || out[i]==){
low=Min(low,cntn[i]);
}
}
ans+=(LL)(n-)*n-(LL)low*(n-low)-(LL)m; printf("%I64d\n",ans);
}
return ;
}

HDU-4635 Strongly connected 强连通,缩点的更多相关文章

  1. hdu 4635 Strongly connected 强连通缩点

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...

  2. HDU 4635 Strongly connected(强连通)经典

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

  3. HDU 4635 Strongly connected (强连通分量+缩点)

    <题目链接> 题目大意: 给你一张有向图,问在保证该图不能成为强连通图的条件下,最多能够添加几条有向边. 解题分析: 我们从反面思考,在该图是一张有向完全图的情况下,最少删去几条边能够使其 ...

  4. HDU 4635 Strongly connected (强连通分量)

    题意 给定一个N个点M条边的简单图,求最多能加几条边,使得这个图仍然不是一个强连通图. 思路 2013多校第四场1004题.和官方题解思路一样,就直接贴了~ 最终添加完边的图,肯定可以分成两个部X和Y ...

  5. hdu 4635 Strongly connected 强连通

    题目链接 给一个有向图, 问你最多可以加多少条边, 使得加完边后的图不是一个强连通图. 只做过加多少条边变成强连通的, 一下子就懵逼了 我们可以反过来想. 最后的图不是强连通, 那么我们一定可以将它分 ...

  6. HDU 4635 —— Strongly connected——————【 强连通、最多加多少边仍不强连通】

    Strongly connected Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u ...

  7. HDU 4635 Strongly connected (2013多校4 1004 有向图的强连通分量)

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

  8. hdu 4635 Strongly connected(强连通)

    考强连通缩点,算模板题吧,比赛的时候又想多了,大概是不自信吧,才开始认真搞图论,把题目想复杂了. 题意就是给你任意图,保证是simple directed graph,问最多加多少条边能使图仍然是si ...

  9. HDU 4635 Strongly connected (Tarjan+一点数学分析)

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

  10. HDU 4635 Strongly connected(强连通分量缩点+数学思想)

    题意:给出一个图,如果这个图一开始就不是强连通图,求出最多加多少条边使这个图还能保持非强连通图的性质. 思路:不难想到缩点转化为完全图,然后找把它变成非强连通图需要去掉多少条边,但是应该怎么处理呢…… ...

随机推荐

  1. unity3d与eclipse集成开发android应用

    原地址:http://blog.csdn.net/armoonwei/article/details/7032537 Unity as a Library Once you have eclipse ...

  2. c++实现文本中英文单词和汉字字符的统计

    源代码下载:http://download.csdn.net/detail/nuptboyzhb/4987141 1.统计文本中汉字的频数,为后续的文本分类做基础.对于汉字的统计,需要判断读取的是否为 ...

  3. DLL 支持MFC 没有DLLMAIN函数

    如果使用VC编写DLL时,需要MFC功能: 一般在源文件里就不能手动写DLLMAIN函数了 它给MFC集成了,\src\mfc\dllmodule.cpp打开它,里面有有一个DLLMAIN函数,根据源 ...

  4. zoj 3380 Patchouli's Spell Cards 概率DP

    题意:1-n个位置中,每个位置填一个数,问至少有l个数是相同的概率. 可以转化求最多有l-1个数是相同的. dp[i][j]表示前i个位置填充j个位置的方案数,并且要满足上面的条件. 则: dp[i] ...

  5. Spring mvc 模式小结

    http://www.taobaotesting.com/blogs/2375 1.spring mvc简介 Spring MVC框架是一个MVC框架,通过实现Model-View-Controlle ...

  6. java中List集合及其遍历详解

    1. 首先List<E>集合继承与Collection<E>,是一个接口. ①  Collection (集合框架是JDK1.2版本出现的) ②   list:是有序的,元素可 ...

  7. FPGA中latency与delay概念的区别

    2013-06-17 21:09:26 最近学习流水线以及状态机,总遇到注入加入寄存器可以分割组合逻辑,从而提高电路的运行频率的说法:还有流水线可以提高速度的说法,刚开始很是疑惑,觉得流水线的方法,输 ...

  8. NFC(5)编写NFC程序的基本步骤

    1,设置权限 <uses-permission android:name="android.permission.NFC" /> 2,限制Android版本 <u ...

  9. struts2启动报错com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1

    好久没有搞struts2,今天配置strut2.2.1,启动时遇到个小问题.记录下. tomcat启动报错: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 ...

  10. UVa 1605 (构造) Building for UN

    题意: 有n个国家,要设计一栋长方体的大楼,使得每个单位方格都属于其中一个国家,而且每个国家都要和其他国家相邻. 分析: 紫书上有一种很巧妙的构造方法: 一共有2层,每层n×n.一层是每行一个国家,另 ...