题目链接:https://cn.vjudge.net/contest/67418#problem/G

具体思路:首先用tarjan缩点,这个时候就会有很多个缩点,然后再选取一个含有点数最少,并且当前这个点的出度和入度至少有一个为0,这个原因后面解释。然后选出最少的点 t1 后,当前的图就可以看成两个“缩点”了,除了选出来的t1点,其他点可以形成一个联通块,然后这两个缩点之间可以连着单向边,这样的话能加的边数是最多的。关于为什么选取最小的出度或者入度为0的缩点,就在于两个联通块相连的时候,只能连单向边,如果当前选取的缩点联通块出度和入度都不是0,那么就不会满足单向边的情况了。

minn是满足情况的最小的点。

所以,最多加的边数就是(minn)×(minn-1)+(n-minn)×(n-minn-1)+(minn)×(m-minn)-m。

AC代码:

 #include<iostream>
#include<string>
#include<iomanip>
#include<stack>
#include<algorithm>
#include<queue>
#include<cmath>
#include<cstring>
#include<stdio.h>
#include<map>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = +;
int head[maxn],low[maxn],dfn[maxn],istack[maxn];
int in[maxn],out[maxn];
ll col,num,ind;
stack<int>q;
map<ll,ll>color;
struct node
{
int fr;
int to;
int nex;
} edge[maxn*];
void addedge(int fr,int to)
{
edge[num].fr=fr;
edge[num].to=to;
edge[num].nex=head[fr];
head[fr]=num++;
}
void init()
{
ind=,num=,col=;
color.clear();
while(!q.empty())q.pop();
memset(in,,sizeof(in));
memset(out,,sizeof(out));
memset(low,,sizeof(low));
memset(dfn,,sizeof(dfn));
memset(istack,,sizeof(istack));
memset(head,-,sizeof(head));
}
void tarjan(int u,int root)
{
low[u]=dfn[u]=++ind;
q.push(u);
for(int i=head[u]; i!=-; i=edge[i].nex)
{
int v=edge[i].to;
if(dfn[v]==)
{
tarjan(v,u);
low[u]=min(low[u],low[v]);
}
else if(istack[v]==)
{
low[u]=min(low[u],dfn[v]);
}
}
if(low[u]==dfn[u])
{
int t;
col++;
do
{
t=q.top();
q.pop();
// cout<<t<<endl;
istack[t]=col;
color[col]++;
}
while(t!=u);
}
}
int main()
{
int T;
scanf("%d",&T);
int Case=;
while(T--)
{
init();
ll n,m;
scanf("%lld %lld",&n,&m);
int t1,t2;
for(int i=; i<=m; i++)
{
scanf("%d%d",&t1,&t2);
addedge(t1,t2);
}
for(int i=; i<=n; i++)
{
if(dfn[i]==)
tarjan(i,);
}
for(int i=; i<num; i++)
{
t1=edge[i].fr,t2=edge[i].to;
if(istack[t1]!=istack[t2])
{
in[istack[t2]]++;
out[istack[t1]]++;
}
}
ll minn=inf;
for(int i=; i<=col; i++)
{
if(in[i]==||out[i]==)
{
minn=min(minn,color[i]);
}
}
printf("Case %d: ",++Case);
if(col==)
{
printf("-1\n");
continue;
}
printf("%lld\n",minn*(minn-)+(n-minn)*(n-minn-)+(minn)*(n-minn)-m);
}
return ;
}

强连通图(最多加入几条边使得图仍为非强连通图)G - Strongly connected HDU - 4635的更多相关文章

  1. Strongly connected HDU - 4635(判断强连通图 缩点)

    找出强联通块,计算每个连通块内的点数.将点数最少的那个连通块单独拿出来,其余的连通块合并成一个连通分量. 那么假设第一个连通块的 点数是 x  第二个连通块的点数是 y 一个强连通图(每两个点之间,至 ...

  2. Strongly connected HDU - 4635 原图中在保证它不是强连通图最多添加几条边

    1 //题意: 2 //给你一个有向图,如果这个图是一个强连通图那就直接输出-1 3 //否则,你就要找出来你最多能添加多少条边,在保证添加边之后的图依然不是一个强连通图的前提下 4 //然后输出你最 ...

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

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

  4. 图之强连通、强连通图、强连通分量 Tarjan算法

    原文地址:https://blog.csdn.net/qq_16234613/article/details/77431043 一.解释 在有向图G中,如果两个顶点间至少存在一条互相可达路径,称两个顶 ...

  5. poj 3352 Road Construction【边双连通求最少加多少条边使图双连通&&缩点】

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 10141   Accepted: 503 ...

  6. history统计命令最多的20条

    1.1.1 统计使用命令最多的20条 [root@ob1 ~]# history|awk '{ml[$2]++}END{for (i in ml) print i,ml[i]}'|sort -nrk ...

  7. Highcharts 测量图;Highcharts 圆形进度条式测量图;Highcharts 时钟;Highcharts 双轴车速表;Highcharts 音量表(VU Meter)

    Highcharts 测量图 配置 chart.type 配置 配置 chart 的 type 为 'gauge' .chart.type 描述了图表类型.默认值为 "line". ...

  8. 2017 Wuhan University Programming Contest (Online Round) Lost in WHU 矩阵快速幂 一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开。

    /** 题目:Lost in WHU 链接:https://oj.ejq.me/problem/26 题意:一个无向图,求从1出发到达n最多经过T条边的方法数,边可以重复经过,到达n之后不可以再离开. ...

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

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

随机推荐

  1. [微软官网]One Windows Kernel

    One Windows Kernel https://techcommunity.microsoft.com/t5/Windows-Kernel-Internals/One-Windows-Kerne ...

  2. c语言基础笔记

    一 :数据类型 1.float类型,在输出的时候可以使用 .数字  来把浮点数精确到小数点后几位,比如 printf("%.3f",float)精确到小数点后三位,不足补0 2.字 ...

  3. window redis php(必须版本>=5.4) 安装

    1.下载redis的win版客户端 下载地址: http://code.google.com/p/servicestack/wiki/RedisWindowsDownload 2.选择32bit,64 ...

  4. PHP面向对象之抽象类,抽象方法

    抽象类,抽象方法 抽象类: 是一个不能实例化的类: 定义形式: abstract  class  类名{} 为什么需要抽象类: 它是为了技术管理而设计! 抽象方法: 是一个只有方法头,没有方法体的方法 ...

  5. linux 上传下载

    xshell yum就是傻瓜式的安装软件,你要装什么,yum什么就行了,红帽系统才有yum,乌班图和debian是没有的 输入命令:sudo yum -y install lrzsz rz  上传 从 ...

  6. 【Python】Python的time和datetime模块

    time 常用的有time.time()和time.sleep()函数. import time print(time.time()) 1499305554.3239055 上面的浮点数称为UNIX纪 ...

  7. noip模拟题《迷》enc

    [问题背景]zhx 和他的妹子聊天.[问题描述]     考虑一种简单的加密算法.     假定所有句子都由小写英文字母构成, 对于每一个字母, 我们将它唯一地映射到另一个字母.例如考虑映射规则:a- ...

  8. @Resource 和 @Autowired 区别

    spring不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource.@PostConstruct以及@PreDestroy. @Resour ...

  9. Cows and Cars UVA - 10491 (古典概率)

    按照题目的去推就好了 两种情况 1.第一次选择奶牛的门  概率是 a/(a+b) 打开c扇门后  除去选择的门 还剩 a-1-c+b扇门  则选到车的概率为b/(a-1-c+b) 2.第一次选择车的门 ...

  10. 【刷题】BZOJ 1195 [HNOI2006]最短母串

    Description 给定n个字符串(S1,S2,„,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,„,Sn)都是T的子串. Input 第一行是一个正整数n(n<=12) ...