题意:给你一个图,问最多能添加多少条边使图仍为不是强连通图,如果原图是强连通输出 ‘-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 (ubuntu) 下设置 tomcat 随系统自动启动

    网上说的有很多, 我只记录一种 1. 切换到 /etc/init.d/ 目录下 2. sudo vim tomcat 3. 在打开的文件里写入以下内容 #!/bin/sh # chkconfig: # ...

  2. POJ 3449 Geometric Shapes (求正方形的另外两点)

    Geometric Shapes Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1470   Accepted: 622 D ...

  3. Composite 组合模式

      简介         <大话设计模式>一书中组合模式的定义为:将对象组合成[树]形结构以表示[部分-整体]的层次结构,组合模式使得用户对[单个对象]和对[组合对象]的使用具有一致性. ...

  4. 关于<:if>没有<c:else>解决方案

    <c:if>没有<c:else>可以用<c:choose>来取代结构: <c:choose> <c:when test=""& ...

  5. 016_openxml_forxml

    016_openxml_forxml --openxml*********************************************************************** ...

  6. EBS基础—表的后缀

    1._ALL或无后缀:基表,所有对数据操作最终都是对基表的操作,表包含所有不同经营单位的信息,多组织环境. 2._B/_T:也是一种基表.一些数据和验证存储在此表中. 3._TL:语言的基表,TL表支 ...

  7. uvalive 5760 Alice and Bob (组合游戏,dp)

    题目链接: http://vjudge.net/problem/viewProblem.action?id=25636 对于>1的堆,必然会被其中一人全部合并. 然后就是二维dp,dp[非1堆的 ...

  8. Static Class (静态类)

    一般情况下是不可以用static修饰类的.如果一定要用static修饰类的话,通常static修饰的是匿名内部类. 在一个类中创建另外一个类,叫做成员内部类.这个成员内部类可以静态的(利用static ...

  9. Objective-C中的协议(Protocol)和类别(Category)

    1.什么是协议? 2.协议与类别的声明和使用 1.什么是协议? 在Objective-C中,不支持多继承,即不允许一个类有多个父类,但是OC提供了类似的实现方法,也就是协议.协议有点类似于Java里的 ...

  10. underscorejs-each学习

    2.1 each 2.1.1 语法: _.each(list, iteratee, [context]) 2.1.2 说明: 依次对集合的所有元素进行某种操作,原样返回list.接收3个参数,list ...