http://acm.hdu.edu.cn/showproblem.php?pid=4635

题意:给出n个点和m条边,问最多能添加几条边使得图不是一个强连通图。如果一开始强连通就-1.思路:把图分成x个强连通分量之后,每个强连通分量最大的边数是n*(n-1),然后考虑和其他强连通分量相连的情况:即把分量a的所有点都连向分量b的所有点,而b不连a,这样就可以让图不是强连通的。可以把整个图分成两个强连通分量a和b分别有i和j个点,其中i+j=n,那么答案就是n*(n-1)-m-i*j。所以求出最小的i*j就可以找到答案了。

 #include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <queue>
#include <vector>
#include <stack>
using namespace std;
#define N 100010
struct node
{
int v, next, u;
}edge[N]; int n, tot, cnt, num, head[N], dfn[N], low[N], belong[N], in[N], out[N], deg[N], tol[N], e[N];
bool vis[N];
stack<int> sta; void init()
{
tot = ;
num = ;
cnt = ;
while(!sta.empty()) sta.pop();
memset(head, -, sizeof(head));
memset(vis, false, sizeof(vis));
memset(low, , sizeof(low));
memset(dfn, , sizeof(dfn));
memset(belong, , sizeof(belong));
memset(in, , sizeof(in));
memset(out, , sizeof(out));
memset(deg, , sizeof(deg));
memset(tol, , sizeof(tol));
memset(e, , sizeof(e));
} void add(int u, int v)
{
edge[tot].u = u; edge[tot].v = v; edge[tot].next = head[u]; head[u] = tot++;
} void tarjan(int u)
{
vis[u] = ; sta.push(u);
dfn[u] = low[u] = ++cnt;
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].v;
if(!dfn[v]) {
tarjan(v);
if(low[v] < low[u]) low[u] = low[v];
} else if(vis[v]) {
if(dfn[v] < low[u]) low[u] = dfn[v];
}
}
if(low[u] == dfn[u]) {
++num;
int top = -;
while(top != u) {
top = sta.top(); sta.pop();
vis[top] = ;
belong[top] = num;
}
}
} bool cmp(const int &a, const int &b)
{
if(out[a] != ) return false;
if(out[b] != ) return true;
return tol[a] < tol[b];
} int main()
{
int t, cas = ;
scanf("%d", &t);
while(t--) {
int n, m;
scanf("%d%d", &n, &m);
init();
for(int i = ; i < m; i++) {
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
deg[u]++; deg[v]++;
}
for(int i = ; i <= n; i++) {
if(!dfn[i]) tarjan(i);
}
printf("Case %d: ", cas++);
if(num == ) {
puts("-1"); continue;
}
// printf("~~~\n");
for(int u = ; u <= n; u++) {
for(int i = head[u]; ~i; i = edge[i].next) {
int v = edge[i].v;
if(belong[u] != belong[v]) {
in[belong[v]]++;
out[belong[u]]++;
}
}
}
long long sum = (long long)n * (n - ) - m;
for(int i = ; i <= n; i++) {
int tmp = belong[i];
tol[tmp]++;
}
long long ans = ;
for(int i = ; i <= num; i++) {
if(!in[i] || !out[i]) {
ans = max(ans, sum - (long long)(n - tol[i]) * tol[i]);
}
}
printf("%I64d\n", ans);
}
return ;
} /*
1
6 7
1 2
2 3
3 1
4 5
5 6
6 4
6 1
*/

HDU 4635:Strongly connected(强连通)的更多相关文章

  1. hdu 4635 Strongly connected 强连通缩点

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

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

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

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

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

  4. hdu 4635 Strongly connected 强连通

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

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

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

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

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

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

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

  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(强连通)

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

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

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

随机推荐

  1. Vue.2.0.5-计算属性

    计算属性 在模板中绑定表达式是非常便利的,但是它们实际上只用于简单的操作.在模板中放入太多的逻辑会让模板过重且难以维护.例如: <div id="example"> { ...

  2. tooltip

    /* 背景色 ; 字体颜色 ; 云,显示在上面 */ .tooltip-inner{ background-color: #FF0000; ForeColor:#0f0; IsBalloon:true ...

  3. CentOS6.5 安装HAProxy 1.5.20

    [在CentOS下安装haproxy] sudo yum install haproxy 编辑配置文件 vim /etc/haproxy/haproxy.cfg #------------------ ...

  4. struts2 标签为简单标签

    <s:form method="post" action="" theme="simple"> <s:textfield ...

  5. C++(VS2012)DLL动态库的生成和调用

    DLL动态链接库的生成: 首先打开VS2012,新建——项目——Win32控制台应用程序(项目名称:ConsoleApplication1)——空项目 新建一个源文件source.cpp 先用控制台e ...

  6. Extjs布局

    今天我来总结一下extjs下面的各种布局,不仅是为了给自己做笔记,同时,也希望让刚刚接触extjs的朋友们快速的了解下,大神就不用看了.废话不多说,开始布局的讲解. (以下代码都可以直接在javasc ...

  7. Android 发送短信与接收短信

    package com.example.testsms; import android.app.Activity; import android.app.PendingIntent; import a ...

  8. java 字符串转json,json转对象等等...

    @RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...

  9. sql 存储过程 分页

    ALTER PROCEDURE [dbo].[BrokerToLenderDataShow2]@Where VARCHAR(200), --查询条件 不含'where'字符,如id>10 and ...

  10. Mysql存储过程总结

    1.     关于MySQL的存储过程 存储过程是数据库存储的一个重要的功能,但是MySQL在5.0以前并不支持存储过程,这使得MySQL在应用上大打折扣.好在MySQL 5.0终于开始已经支持存储过 ...