Hdu 4635 Strongly connected

题目链接:

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

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #include <algorithm>
  5 using namespace std;
  6
  7 typedef long long LL;
  8 const int maxn = 100005;
  9 const int INF = 0x3f3f3f3f;
 10 struct node
 11 {
 12     int to, next;
 13 } edge[maxn];
 14 int head[maxn], low[maxn], dfn[maxn], stack[maxn], num[maxn];
 15 int instack[maxn], id[maxn], out[maxn], in[maxn], cnt, tot, top, ntime;
 16
 17 void init ()
 18 {
 19     cnt = tot = top = ntime = 0;
 20     memset (in, 0, sizeof(in));
 21     memset (id, 0, sizeof(id));
 22     memset (low, 0, sizeof(low));
 23     memset (dfn, 0, sizeof(dfn));
 24     memset (num, 0, sizeof(num));
 25     memset (out, 0, sizeof(out));
 26     memset (head, -1, sizeof(head));
 27     memset (stack, 0, sizeof(stack));
 28     memset (instack, 0, sizeof(instack));
 29 }
 30 void Add (int from, int to)
 31 {
 32     edge[tot].to = to;
 33     edge[tot].next = head[from];
 34     head[from] = tot ++;
 35 }
 36 void Tarjan (int u)
 37 {
 38     low[u] = dfn[u] = ++ ntime;
 39     stack[top++] = u;
 40     instack[u] = 1;
 41     for (int i=head[u]; i!=-1; i=edge[i].next)
 42     {
 43         int v = edge[i].to;
 44         if (!dfn[v])
 45         {
 46             Tarjan(v);
 47             low[u] = min (low[u], low[v]);
 48         }
 49         else if (instack[v])
 50             low[u] = min (low[u], dfn[v]);
 51     }
 52     if (dfn[u] == low[u])
 53     {
 54         cnt ++;
 55         while (1)
 56         {
 57             int v = stack[--top];
 58             instack[v] = 0;
 59             num[cnt] ++;
 60             id[v] = cnt;
 61             if (v == u)
 62                 break;
 63         }
 64     }
 65 }
 66 int main ()
 67 {
 68     int t, m, u, v, l = 0;
 69     LL  n;
 70     scanf ("%d", &t);
 71     while (t --)
 72     {
 73         init ();
 74         scanf ("%lld %d", &n, &m);
 75         for (int i=1; i<=m; i++)
 76         {
 77             scanf ("%d %d", &u, &v);
 78             Add (u, v);
 79         }
 80         for (int i=1; i<=n; i++)
 81             if (!dfn[i])
 82                 Tarjan (i);
 83         if (cnt == 1)
 84         {
 85             printf ("Case %d: -1\n", ++l);
 86             continue;
 87         }
 88         for (int i=1; i<=n; i++)
 89             for (int j=head[i]; j!=-1; j=edge[j].next)
 90             {
 91                 u = id[i];
 92                 v = id[edge[j].to];
 93                 if (u != v)
 94                 {
 95                     in[u] ++;
 96                     out[v] ++;
 97                 }
 98             }
 99         LL x, ans = 0;
100         x = n * (n - 1) - m;
101         for (int i=1; i<=cnt; i++)
102             if (!in[i] || !out[i])
103                 ans = max (ans, x - num[i] * (n-num[i]));
104         printf ("Case %d: %lld\n", ++l, ans);
105     }
106     return 0;
107 }
时间: 2024-10-03 20:10:33

Hdu 4635 Strongly connected的相关文章

[tarjan] hdu 4635 Strongly connected

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4635 Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1568    Accepted Submission(s): 654 Problem Description Give a simple dir

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

Strongly connected Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 4635 Description Give a simple directed graph with N nodes and M edges. Please tell me the maximum number of the edges you can

HDU 4635 Strongly connected (有向图的强连通分量)

Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Give a simple directed graph with N nodes and M edges. Please tell me the maximum number of the edges you can add that the grap

HDU 4635 Strongly connected(强连通)经典

Strongly connected Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1828    Accepted Submission(s): 752 Problem Description Give a simple directed graph with N nodes and M edges. Please tell me

hdu 4635 Strongly connected (tarjan)

题意:给一个n个顶点m条弧的简单有向图(无环无重边),求最多能够加入多少条弧使得加入后的有向图仍为简单有向图且不是一个强连通图.假设给的简单有向图本来就是强连通图,那么输出-1. 分析: 1.用tarjan算法求出强连通分量的个数,假设个数为1,那么输出-1,结束,否则运行2 2.如果将一些强连通分量合并为有n1个顶点简单全然图1,而将剩下的强连通分量合并为n2个顶点的简单全然图2,跨这两个简单全然图的弧的方向仅仅能是单向的,如果m1为全然图1内部的弧的数量,m2为为全然图2内部的弧的数量.m3

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

题意:给出一个有向图(不一定连通),问最多可添加多少条边而该图仍然没有强连通. 思路: 强连通分量必须先求出,每个强连通分量包含有几个点也需要知道,每个点只会属于1个强连通分量. 在使图不强连通的前提下,要添加尽可能多的边.边至多有n*(n-1)条,而已经给了m条,那么所能添加的边数不可能超过k=n*(n-1)-m. 这k条边还有部分不能添加,一添加立刻就强连通.一个强连通图最少只需要n条边,根据强连通的特性,缩点之后必定是不会有环的存在的,那么只要继续保持没有环的存在即可.我们只要让其中1个强

HDU 4635 Strongly connected 强连通分量

参考:http://www.cnblogs.com/jackge/p/3231767.html 讲的很好 感悟:最好的情况肯定是完全图,但是不允许,所以一定是有些符合u->v,但是v不能到u, 在保证这样的情况,最大化边数,最终会形成两个图,然后应用不等式 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath>

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

题意:给出一个图,如果这个图一开始就不是强连通图,求出最多加多少条边使这个图还能保持非强连通图的性质. 思路:不难想到缩点转化为完全图,然后找把它变成非强连通图需要去掉多少条边,但是应该怎么处理呢……有人给出这样的答案,找到分量中点数最少的块,把它的所有入边都去掉……好像是对的,但是万一这个块本来就有一个入度怎么办?这个边是不可以删的啊.所以我觉得这种办法是有点的问题的,所以最靠谱的方法还是斌哥他们给出的方法,最后的时候把点分成两个集合x和y,x和y本身都是完全图块,然后让x中的每一个点都指向y

爆零后的感受外加一道强联通分量HDU 4635的题解

今天又爆零了,又是又,怎么又是又,爆零爆多了,又也就经常挂嘴边了,看到这句话,你一定很想说一句"",弱菜被骂傻,也很正常啦. 如果你不开心,可以考虑往下看. 翻到E(HDU 4635 Strongly connected)题,这么短的题目,肯定要先看啦.然后D(LightOJ 1229),然后C(ZOJ 2243),然后F(HDU 4711),然后B(CodeForces 385D),然后看A(HDU 3889)好吧,我承认,A题看了一眼就不看了,B题一看是线段什么有点几何的味道就果断