<题目链接>

题目大意:

给你一张有向图,问在保证该图不能成为强连通图的条件下,最多能够添加几条有向边。

解题分析:

我们从反面思考,在该图是一张有向完全图的情况下,最少删去几条边能够使其不是强连通图。即,开始的时候,图的总边树为 n*(n-1),减去m条已有的边。然后把原图中所有的强连通块进行缩点,对于缩好的点,我们把其分成两部分,保证这两部分点不能够相互可达(即这两部分不是强连通),所以我们要减去一个部分到另一部分的所有同一方向的边,比如将连通块1到连通块2的所有边都删除,这样,这两部分点就不强连通,整张图也不是强连通图。那如何使删除的边最小呢?因为删除的边为cnt*(n-cnt),根据简单的数学常识,必然是cnt和(n-cnt)差值最大的时候,他们的乘积最小,所以我们只要记录所有连通块中点数最少的数量即可。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std; typedef long long ll;
const int N = ;
const int INF = 0x3f3f3f3f; struct Edge{
int to,next;
}edge[N<<]; ll n,m,cnt,head[N];
ll tot,top,atype;
ll dfn[N],low[N],vis[N],stack[N],belong[N],indeg[N],outdeg[N],sum[N];
void init(){
cnt=,tot=,top=,atype=;;
memset(head,-,sizeof(head));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(vis,,sizeof(vis));
memset(belong,,sizeof(belong));
memset(indeg,,sizeof(indeg));
memset(outdeg,,sizeof(outdeg));
memset(sum,,sizeof(sum));
}
void addedge(int u,int v){
edge[++cnt].to=v,edge[cnt].next=head[u];
head[u]=cnt;
}
void Tarjan(int u){
dfn[u]=low[u]=++tot;
stack[top++]=u;
vis[u]=;
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(!dfn[v]){
Tarjan(v);
low[u]=min(low[u],low[v]);
}else if(vis[v]){
low[u]=min(low[u],dfn[v]);
}
}
if(dfn[u]==low[u]){
atype++;
int v;
do{
v=stack[--top];
belong[v]=atype; //将该强连通块缩点染色
sum[atype]++; //统计该强连通块的点的数量
vis[v]=;
}while(u!=v);
}
} int main(){
int t,cases=;
scanf("%d",&t);
while(t--){
scanf("%lld%lld",&n,&m);
init();
for(int i=;i<m;i++){
int u,v;scanf("%d%d",&u,&v);
addedge(u,v);
}
for(int i=;i<=n;i++)
if(!dfn[i])Tarjan(i);
if(atype==){
printf("Case %d: -1\n",++cases);
continue;
}
for(int u=;u<=n;u++)
for(int i=head[u];i!=-;i=edge[i].next){
int v=edge[i].to;
if(belong[u]!=belong[v]){ //统计每个连通块的初度和入度
outdeg[belong[u]]++;
indeg[belong[v]]++;
}
}
ll ans=,cnt=INF;
for(int i=;i<=atype;i++)
if(indeg[i]==||outdeg[i]==) //更新初度和入读为0的联通块的数量最小值,因为只需删除一个方向的边
cnt=min(cnt,sum[i]);
ans=n*(n-)-m-cnt*(n-cnt); //n*(n-1)为有向完全图的所有边,m为原图已有的边,cnt*(n-cnt)为分成两部分后删除一个方向的边
printf("Case %d: %lld\n",++cases,ans);
}
return ;
}

2018-11-08

HDU 4635 Strongly connected (强连通分量+缩点)的更多相关文章

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

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

  2. hdu 4635 Strongly connected 强连通缩点

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

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

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

  4. hdu 4635 Strongly connected 强连通

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

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

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

  6. HDU 4635 Strongly connected(强连通分量,变形)

    题意:给出一个有向图(不一定连通),问最多可添加多少条边而该图仍然没有强连通. 思路: 强连通分量必须先求出,每个强连通分量包含有几个点也需要知道,每个点只会属于1个强连通分量. 在使图不强连通的前提 ...

  7. HDU 4635 - Strongly connected(2013MUTC4-1004)(强连通分量)

    t这道题在我们队属于我的范畴,最终因为最后一个环节想错了,也没搞出来 题解是这么说的: 最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯 ...

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

    好久没写tarjan了,写起来有点手生,还好1A了- -. 题意:给定一个有向图,问最多添加多少条边,让它依然不是强连通图. 分析:不妨考虑最大时候的临界状态(即再添加一条边就是强连通图的状态),假设 ...

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

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

随机推荐

  1. dict-test

    #! -*- coding:utf-8 -*-"""键必须是唯一的,但值则不必len(dict) 计算字典元素个数,即键的总数str(dict) 输出字典,以可打印的字符 ...

  2. 树形dp 入门

    今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...

  3. json与字典的区别

  4. 反向找related_name以及limit_fields_to

    问题2:客户的添加页面,通过popup创建用户时 解决方案: 如果新创建的用户时:如果是销售部的人,页面才增加 目的是:拿到limit_choices_to,就可以判断了 当有两个Foreignkey ...

  5. LeetCode(70): 爬楼梯

    Easy! 题目描述: 假设你正在爬楼梯.需要 n 步你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2 ...

  6. JavaScript实现的抛物线运动效果

    css88 技术文档地址: http://www.css88.com/archives/5355 张鑫旭 技术文档地址: https://www.zhangxinxu.com 使用示例: 使用时直接引 ...

  7. 论文阅读笔记十三:The One Hundred Layers Tiramisu: Fully Convolutional DenseNets for Semantic Segmentation(FC-DenseNets)(CVPR2016)

    论文链接:https://arxiv.org/pdf/1611.09326.pdf tensorflow代码:https://github.com/HasnainRaz/FC-DenseNet-Ten ...

  8. Spring.Net 简单实例-01(IOC)

    1.话不多说看操作.新建"Windows窗体应用程序" 2:通过配置文件创建IOC容器 首先引入安装包 3:定义一个接口(更好的体现封装性,当然也可以直接使用类) 定义一个类,实现 ...

  9. k3 Bos开发百问百答

              K/3 BOS开发百问百答   (版本:V1.1)           K3产品市场部       目录 一.基础资料篇__ 1 [摘要]bos基础资料的显示问题_ 1 [摘要]单 ...

  10. js中类定义函数时用prototype与不用的区别

    转载自:https://blog.csdn.net/yexudengzhidao/article/details/72866047 先看例子 function ListCommon2(first,se ...