题意:给你一个图,问最多能添加多少条边使图仍为不是强连通图,如果原图是强连通输出 ‘-1’
分析:先把求出连通分量进行缩点,因为是求最多的添加边,所以可以看成两部分 x,y,只能一部分向另外一部分连边,内部的就是完全图,所以是x*(x+1)+x*y+y*(y+1)-M,只需要求出来出度或者入度为0的最少点的那个连通分量即可。
**********************************************************************
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std; const int MAXN = 1e5+;
const int oo = 1e9; struct Edge{int v, next;}e[MAXN];
int Head[MAXN], cnt;
void AddEdge(int u, int v)
{
    e[cnt].v = v;
    e[cnt].next = Head[u];
    Head[u] = cnt++;
} int dfn[MAXN], low[MAXN], Index;
int Stack[MAXN], top, inStack[MAXN];
int blg[MAXN], bnt, nblg[MAXN];///属于哪个连通分量,连通分量里面有几个点
int outEdge[MAXN], inEdge[MAXN]; void InIt(int N)
{
    cnt = Index = top = bnt = ;
    for(int i=; i<=N; i++)
    {
        Head[i] = -;
        dfn[i] = ;
        nblg[i] = ;
        outEdge[i] = ;
        inEdge[i] = ;
    }
}
void Tarjan(int u)
{
    int v;     low[u] = dfn[u] = ++Index;
    Stack[++top] = u;
    inStack[u] = true;     for(int j=Head[u]; j!=-; j=e[j].next)
    {
        v = e[j].v;
        if( !dfn[v] )
        {
            Tarjan(v);
            low[u] = min(low[u], low[v]);
        }
        else if(inStack[v] == true)
            low[u] = min(low[u], dfn[v]);
    }     if(low[u] == dfn[u])
    {
        ++bnt;
        do
        {
            v = Stack[top--];
            inStack[v] = false;
            blg[v] = bnt;
            nblg[bnt]++;
        }
        while(u != v);
    }
} int main()
{
    int T, t=;     scanf("%d", &T);     while(T--)
    {
        int i, j, u, v, N, M;         scanf("%d%d", &N, &M);         InIt(N);         for(i=; i<M; i++)
        {
            scanf("%d%d", &u, &v);
            AddEdge(u, v);
        }         for(i=; i<=N; i++)
        {
            if( !dfn[i] )
                Tarjan(i);
        }         for(i=; i<=N; i++)
        for(j=Head[i]; j!=-; j=e[j].next)
        {
            v = e[j].v;
            if(blg[i] != blg[v])
            {
                inEdge[ blg[v] ]++;
                outEdge[ blg[i] ]++;
            }
        }         int x, y=oo;         for(i=; i<=bnt; i++)
        {
            if(!outEdge[i] || !inEdge[i])
                y = min(y, nblg[i]);
        }         x = N-y;         if(bnt == )
            printf("Case %d: -1\n", t++);
        else
            printf("Case %d: %lld\n",t++, (long long)x*(x-)+x*y+y*(y-)-M);
    }     return ; } 

G - Strongly connected - hdu 4635(求连通分量)的更多相关文章

  1. 强连通图(最多加入几条边使得图仍为非强连通图)G - Strongly connected HDU - 4635

    题目链接:https://cn.vjudge.net/contest/67418#problem/G 具体思路:首先用tarjan缩点,这个时候就会有很多个缩点,然后再选取一个含有点数最少,并且当前这 ...

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

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

  3. kuangbin专题 专题九 连通图 Strongly connected HDU - 4635

    题目链接:https://vjudge.net/problem/HDU-4635 题目:有向图,给定若干个连通图,求最多还能添加几条边,添完边后,图仍然要满足 (1)是简单图,即没有重边或者自环 (2 ...

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

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

  5. hdu 1213 求连通分量(并查集模板题)

    求连通分量 Sample Input2 //T5 3 //n m1 2// u v2 34 5 5 12 5 Sample Output24 # include <iostream> # ...

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

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

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

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

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

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

  9. hdu 4635 Strongly connected 强连通缩点

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

随机推荐

  1. linux sysvinit与upstart [转]

    linux sysvinit与upstart(1) linux sysvinit与upstart(2) linux sysvinit与upstart(3)

  2. springmvc常见注解模式

    常用注解元素 @Controller 标注在Bean的类定义处 @RequestMapping 真正让Bean具备 Spring MVC Controller 功能的是 @RequestMapping ...

  3. node.js的ejs模版引擎

    ejs版本是0.8.8,生成的views目录下面只有index.ejs and error.ejs,没有layout.ejs. D:\lianchuangfile\nodeDevelop\microb ...

  4. CSS中表示cellpadding和cellspacing的方法

    本文和大家重点讨论一下用CSS来表示表格的cellpadding和cellspacing方法,表格的cellpadding和cellspacing我们经常会用一定的方式来清除默认样式,请看下文详细介绍 ...

  5. Android开发笔记:安卓程序截屏方法

    1,基于Android SDK的截屏方法 (1)主要就是利用SDK提供的View.getDrawingCache()方法.网上已经有很多的实例了.首先创建一个android project,然后进行L ...

  6. [转帖]了解AmbiLight知识

    了解科技前沿的方法..American Online=AOL.algorithm算法.(Denzel say, and I don't know) Engadget瘾科技网站.英文版Engadget网 ...

  7. python正则表达式之使用规则

         正则表达式在我看来是提供一个模板,将待匹配的字符串与模板匹配,匹配不到则返回为空,匹配成功根据需要返回匹配的字符串. 正则表达式比字符串本身的功能要强一点,当然性能上略有不如. 我们使用正则 ...

  8. 在jQuery.getData中renderCallback使用不同创建方式的结果

    JavaScript 中需要创建函数的话,有两种方法:函数声明.函数表达式,各自写法如下:// 方法一:函数声明function foo() {}// 方法二:函数表达式var foo = funct ...

  9. DeDe友情链接

    图片 {dede:flink row="} [field:link /] {/dede:flink} 文字 {dede:flink row="} [field:link /] {/ ...

  10. 用python+selenium获取XX省交通违章数据

    前言: 目前在研究易信公众号,想给公众号增加一个获取个人交通违章的查询菜单,通过点击返回查询数据.以下是实施过程. 一.首先,用火狐浏览器打开XX省交管网,分析页面信息: 可以看到共有4种查询种类,我 ...