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

题意:给你一个n个点m条边的图,问在图不是强连通图的情况下,最多可以向图中添多少条边,若图为原来就是强连通图,输出-1即可;

思路:最后得到的图肯定分为两部分x和y,且两部分均为强连通分量,要么x的点到y的所有点有边,要么,从y的所有点到x的所有点有边;(其中只有入度或出度为0的点才可能成为x或y)

则有         x+y=n 

答案为 ans = y*(y-1) + x*(x-1)+ y*x - m;

化简后 ans = n*n - n -n*x - x*x - m;

由以上化简试,x越小,ans值越大(答案最多为一百亿,long long 之)

#include "stdio.h"  //hdu 4635 强连通缩点
#include "string.h"
#include "vector"
#include "stack"
using namespace std; #define N 201000
#define INF 0x3fffffff long long n,m;
int time;
stack<int> q;
int dfn[N],low[N];
int MIN(int x,int y) { return x<y?x:y; }
long long MAX(long long x,long long y) { return x>y?x:y; } struct node
{
int x,y;
int next;
}edge[2*N];
int idx,head[N]; bool vis[N]; void Init()
{
idx=0;
memset(head,-1,sizeof(head));
} void Add(int x,int y)
{
edge[idx].x = x;
edge[idx].y = y;
edge[idx].next = head[x];
head[x] = idx++;
} int countt; //统计缩点个数
int num[N]; //统计每个缩点内的点的个数
int ru_du[N],chu_du[N]; //统计缩点的出,入度
int belong[N]; //标记点属于哪个缩点 void DFS(int x)
{
int i,y;
q.push(x);
vis[x] = true;
dfn[x] = low[x] = ++time;
for(i=head[x]; i!=-1; i=edge[i].next)
{
y = edge[i].y;
if(!dfn[y])
{
DFS(y);
low[x] = MIN(low[x],low[y]);
}
else if(vis[y]) //强双连通图出现的新判断条件
low[x] = MIN(dfn[y],low[x]);
}
if(low[x]==dfn[x])
{
int temp;
countt++;
while(1)
{
temp = q.top();
q.pop();
belong[temp] = countt;
num[countt]++;
vis[temp] = false; //还原了~
if(temp==x) break;
}
}
} long long Solve()
{
int i;
int x,y;
time = countt = 0;
memset(dfn,0,sizeof(dfn));
memset(num,0,sizeof(num));
memset(belong,0,sizeof(belong));
memset(vis,false,sizeof(vis));
for(i=1; i<=n; ++i)
{
if(!dfn[i])
DFS(i);
}
if(countt==1) return -1;
memset(ru_du,0,sizeof(ru_du));
memset(chu_du,0,sizeof(chu_du));
for(i=0; i<idx; ++i)
{
x = edge[i].x;
y = edge[i].y;
if(belong[x]!=belong[y])
{
chu_du[belong[x]]++;
ru_du[belong[y]]++;
}
}
long long ans=0,mint;
for(i=1; i<=countt; ++i)
{
if(chu_du[i]==0 || ru_du[i]==0){
mint = num[i];
ans = MAX(ans,n*n-n-mint*(n-mint)-m);
}
}
return ans;
} int main()
{
int T,Case=0;
int i;
int x,y;
scanf("%d",&T);
while(T--)
{
Init();
Case++;
scanf("%lld %lld",&n,&m);
for(i=0; i<m; ++i)
{
scanf("%d %d",&x,&y);
Add(x,y);
}
printf("Case %d: ",Case);
printf("%lld\n",Solve());
}
}

hdu 4635 Strongly connected 强连通缩点的更多相关文章

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

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

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

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

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

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

  4. hdu 4635 Strongly connected 强连通

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

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

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

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

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

  7. hdu 4635 Strongly connected(强连通)

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

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

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

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

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

随机推荐

  1. 如何快速开发树形列表和分页查询整合的WInform程序界面

    我在做Winform界面的时候,一般都是统一化处理,界面顶部放置一些字段条件供查询,下面就是分页查询列表,展示相关的数据.但有时候碰到一些表字段内容分类比较多,有一些特别重要,如果放在一个树形列表来进 ...

  2. 推荐使用C++ 11

    如果你的代码工作正常并且表现良好,你可能会想知道为什么还要使用C++ 11.当然了,使用用最新的技术感觉很好,但是事实上它是否值得呢? 在我看来,答案毫无疑问是肯定的.我在下面给出了9个理由,它们分为 ...

  3. C++隐藏规则

    在面向对象的开发过程中,经常出现类的继承,这里面出现的成员函数的重载(overload).覆盖(override)与隐藏(hidden)很容易混淆. 首先澄清这3个概念: 重载 相同的范围(在同一个类 ...

  4. jython 2.7 b3发布

    Jython 2.7b3 Bugs Fixed - [ 2108 ] Cannot set attribute to instances of AST/PythonTree (blocks pyfla ...

  5. ahjesus Unity3D XML注释被编译的问题

    public class XMLStringReader : MonoBehaviour { public string slectedItem; private bool editing = fal ...

  6. linux压缩和解压命令总结

    一.tar.gz tar -xzvf 二.tar.bz2 tar.bz2 解压命令 bzip2 -d  gcc-4.1.0.tar.bz2---上面解压完之后执行下面的命令.执行成功后,会解压生成一个 ...

  7. NTFS碎片

    在Windows操作系统中查看各分区的文件系统: fsutil fsinfo ntfsinfo c: (查看C:盘的文件系统) fsutil fsinfo ntfsinfo d: (查看D:盘的文件系 ...

  8. JS中检测数据类型的几种方式及优缺点

    1.typeof 用来检测数据类型的运算符 typeof value 返回值首先是一个字符串,其次里面包含了对应的数据类型,例如:"number"."string&quo ...

  9. Android启示录——开始Android旅途

    为了明年可以开始进行android程序开发,开始从零开始学习android,仅以此代表第一步开始(*^_^*),开始搭建环境…… 1. 软件下载 http://developer.android.co ...

  10. ECMAScript 6学习笔记(一):展开运算符

    同步发布于:https://mingjiezhang.github.io/(转载请说明此出处). JavaScript是ECMAScript的实现和扩展,ES6标准的制定也为JavaScript加入了 ...