题目链接: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 ;
}

最新文章

  1. Synchronized快
  2. Apache 配置 WebSocket 协议
  3. java的concurrent用法详解
  4. ArcEngine 异常 :The index passed was not within the valid range.
  5. CodeForces 546B C(Contest #1)
  6. js延迟加载,提升网页加载速度
  7. 好记心不如烂笔头之JQuery学习,第四章
  8. Oracle 多行记录合并/连接/聚合字符串的几种方法
  9. 练习题之ExChange
  10. JMX示例
  11. 分布式ElasticSearch简单介绍
  12. UVA11324-- The Largest Clique(SCC+DP)
  13. JAVA基础---编码解码
  14. LeetCode 245. Shortest Word Distance III (最短单词距离之三) $
  15. linux 下配置静态IP
  16. 读取properties配置的工具类
  17. tomcat+struts配置总结
  18. pandas isin
  19. 纯 CSS 实现高度与宽度成比例的效果
  20. 【测试工具】Macaca 自动遍历器 NoSmoke

热门文章

  1. 【C++基础】 各种“虚”总结(ing...)
  2. 漫话C++0x(五)—- thread, mutex, condition_variable
  3. 1058-Tom and Jerry
  4. php的redis 操作类,适用于单台或多台、多组redis服务器操作
  5. [Ruby on Rails系列]5、专题:Talk About SaSS
  6. 2013 Multi-University Training Contest 4 Who&#39;s Aunt Zhang
  7. &lt;context:component-scan&gt;配置解析(转)
  8. Android 内核初识(1)下载源码需求与教程
  9. windows下的go语言的环境搭建和初探
  10. javascript 小日历