HDU-4635 Strongly connected 强连通,缩点
题目链接: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 强连通,缩点的更多相关文章
- hdu 4635 Strongly connected 强连通缩点
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来 ...
- HDU 4635 Strongly connected(强连通)经典
Strongly connected Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- HDU 4635 Strongly connected (强连通分量+缩点)
<题目链接> 题目大意: 给你一张有向图,问在保证该图不能成为强连通图的条件下,最多能够添加几条有向边. 解题分析: 我们从反面思考,在该图是一张有向完全图的情况下,最少删去几条边能够使其 ...
- HDU 4635 Strongly connected (强连通分量)
题意 给定一个N个点M条边的简单图,求最多能加几条边,使得这个图仍然不是一个强连通图. 思路 2013多校第四场1004题.和官方题解思路一样,就直接贴了~ 最终添加完边的图,肯定可以分成两个部X和Y ...
- hdu 4635 Strongly connected 强连通
题目链接 给一个有向图, 问你最多可以加多少条边, 使得加完边后的图不是一个强连通图. 只做过加多少条边变成强连通的, 一下子就懵逼了 我们可以反过来想. 最后的图不是强连通, 那么我们一定可以将它分 ...
- HDU 4635 —— Strongly connected——————【 强连通、最多加多少边仍不强连通】
Strongly connected Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- HDU 4635 Strongly connected (2013多校4 1004 有向图的强连通分量)
Strongly connected Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Other ...
- hdu 4635 Strongly connected(强连通)
考强连通缩点,算模板题吧,比赛的时候又想多了,大概是不自信吧,才开始认真搞图论,把题目想复杂了. 题意就是给你任意图,保证是simple directed graph,问最多加多少条边能使图仍然是si ...
- HDU 4635 Strongly connected (Tarjan+一点数学分析)
Strongly connected Time Limit : 2000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) ...
- HDU 4635 Strongly connected(强连通分量缩点+数学思想)
题意:给出一个图,如果这个图一开始就不是强连通图,求出最多加多少条边使这个图还能保持非强连通图的性质. 思路:不难想到缩点转化为完全图,然后找把它变成非强连通图需要去掉多少条边,但是应该怎么处理呢…… ...
随机推荐
- 1058-Tom and Jerry
描述 Tom和Jerry在10*10的方格中: *...*..... ......*... ...*...*.. .......... ...*.C.... *.....*... ...*...... ...
- Spring mvc 模式小结
http://www.taobaotesting.com/blogs/2375 1.spring mvc简介 Spring MVC框架是一个MVC框架,通过实现Model-View-Controlle ...
- linux查看在线用户 who命令参数及用法
linux who 命令 详解 Linux最常用命令之一 功能说明:显示目前登入系统的用户信息. 语 法:who [-Himqsw][--help][--version][am i][记录文件] 补充 ...
- 【转】linux常用命令全集
linux常用命令全集
- MySQL 5.6 安装配置
mysql 5.6.17下载安装图解_百度经验 http://jingyan.baidu.com/article/4b07be3c67853c48b380f311.html windows 8 系统将 ...
- 当当开源sharding-jdbc,轻量级数据库分库分表中间件
近期,当当开源了数据库分库分表中间件sharding-jdbc. Sharding-JDBC是当当应用框架ddframe中,从关系型数据库模块dd-rdb中分离出来的数据库水平分片框架,实现透明化数据 ...
- Git教程(2)官方命令文档及常用命令表
http://www.cnblogs.com/angeldevil/archive/2013/11/26/3238470.html 1,官方命令文档 http://www.git-scm.com/do ...
- tlplayer 所有平台版本支持水印叠加
tlplayer支持视频渲染前水印叠加,各个系统版本同样支持. 联系方式:weinyzhou86@gmail.com QQ:514540005 版权所有,禁止转载. 发布自:http://blog.c ...
- 函数fsp_alloc_seg_inode_page
分配一个新的inode page /**********************************************************************//** Allocat ...
- bzoj2324
出题人真 口袋迷 很容易发现这是一道费用流的题目 很显然这个问题有两个难点: 保证走到某个点时之前序号的点都被走过 保证每个点都走 对于1,我们换个说法,一个人走到该点时经过的点的序号都小于该点--- ...