做完后,看了解题报告,思路是一样的。我就直接粘过来吧

最终添加完边的图,肯定可以分成两个部X和Y,其中只有X到Y的边没有Y到X的边,那么要使得边数尽可能的多,则X部肯定是一个完全图,Y部也是,同时X部中每个点到Y部的每个点都有一条边,假设X部有x个点,Y部有y个点,有x+y=n,同时边数F=x*y+x*(x-1)+y*(y-1),整理得:F=N*N-N-x*y,当x+y为定值时,二者越接近,x*y越大,所以要使得边数最多,那么X部和Y部的点数的个数差距就要越大,所以首先对于给定的有向图缩点,对于缩点后的每个点,如果它的出度或者入度为0,那么它才有可能成为X部或者Y部,所以只要求缩点之后的出度或者入度为0的点中,包含节点数最少的那个点,令它为一个部,其它所有点加起来做另一个部,就可以得到最多边数的图了

//109MS 	2916KB
#include <stdio.h>
#include <string.h>
#define LL long long
const int M = 100005;
const int inf = 0x3f3f3f3f;
struct Edge
{
int to,nxt;
} edge[M]; int head[M],low[M],dfn[M],stack[M+10];
int vis[M],out[M],in[M],belong[M];
int scc,cnt ,top,ep;
LL n,m;
int min (int a,int b)
{
return a > b ? b : a;
}
void addedge (int cu,int cv)
{
edge[ep].to = cv;
edge[ep].nxt = head[cu];
head[cu] = ep ++;
} void Tarjan(int u)
{
int v;
dfn[u] = low[u] = ++cnt;
stack[top++] = u;
vis[u] = 1;
for (int i = head[u]; i != -1; i = edge[i].nxt)
{
v = edge[i].to;
if (!dfn[v])
{
Tarjan(v);
low[u] = min(low[u],low[v]);
}
else if (vis[v]) low[u] = min(low[u],dfn[v]);
}
if (dfn[u] == low[u])
{
++scc;
do
{
v = stack[--top];
vis[v] = 0;
belong[v] = scc;
}
while (u != v);
}
} void solve()
{
int u,v;
scc = top = cnt = 0;
memset (vis,0,sizeof(vis));
memset (dfn,0,sizeof(dfn));
memset (out,0,sizeof(out));
memset (in,0,sizeof(in));
for (u = 1; u <= n; u ++)
if (!dfn[u])
Tarjan(u); for (u = 1; u <= n; u ++)
{
for (int i = head[u]; i != -1; i =edge[i].nxt)
{
v = edge[i].to;
if (belong[u] != belong[v])
{
out[belong[u]] ++;
in[belong[v]] ++;
}
}
}
int num[M],Min;
memset (num,0,sizeof(num));
for (u = 1; u <= n; u ++)
if (!in[belong[u]]) num[belong[u]] ++;
for (u = 1; u <= scc; u ++)
if (num[u]!= 0&&num[u]<Min)
Min = num[u]; memset (num,0,sizeof(num));
for (u = 1; u <= n; u ++)
if (!out[belong[u]]) num[belong[u]] ++;
for (u = 1; u <= scc; u ++)
if (num[u]!= 0&&num[u]<Min)
Min = num[u];
if (scc == 1)
{
printf ("-1\n");
return ;
}
LL ans = n*(n-1)-Min*(n-Min) - m;
printf ("%I64d\n",ans);
}
int main ()
{
#ifdef LOCAL
freopen("in.txt","r",stdin);
#endif
int T,u,v,cnt = 0;
scanf ("%d",&T);
while (T --)
{
scanf ("%I64d%I64d",&n,&m);
ep = 0;
memset (head,-1,sizeof(head));
for (int i = 0; i < m; i++)
{
scanf ("%d%d",&u,&v);
addedge(u,v);
}
printf ("Case %d: ",++cnt);
solve();
}
return 0;
}

hdu 4635 Strongly connected(Tarjan)的更多相关文章

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

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

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

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

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

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

  4. hdu 4635 Strongly connected 强连通缩点

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

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

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

  6. hdu 4635 Strongly connected (tarjan)

    题意:给一个n个顶点m条弧的简单有向图(无环无重边),求最多能够加入多少条弧使得加入后的有向图仍为简单有向图且不是一个强连通图.假设给的简单有向图本来就是强连通图,那么输出-1. 分析: 1.用tar ...

  7. hdu 4635 Strongly connected

    http://acm.hdu.edu.cn/showproblem.php?pid=4635 我们把缩点后的新图(实际编码中可以不建新图 只是为了概念上好理解)中的每一个点都赋一个值 表示是由多少个点 ...

  8. hdu 4635 Strongly connected(强连通)

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

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

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

随机推荐

  1. BZOJ 3713: [PA2014]Iloczyn

    Description 斐波那契数列的定义为:k=0或1时,F[k]=k:k>1时,F[k]=F[k-1]+F[k-2].数列的开头几项为0,1,1,2,3,5,8,13,21,34,55,-你 ...

  2. UVA 1160 X-Plosives

    题意是一次装入物品,物品由两种元素组成,当遇到即将装入的物品与已经装入的物品形成k个物品,k种元素,跳过该物品的装入.可以将每种元素看成顶点,物品看成一条边.这样问题就转化为利用并查集求环的情况. 算 ...

  3. C++如何处理内联虚函数

    http://blog.csdn.net/hedylin/article/details/1775556 当一个函数是内联和虚函数时,会发生代码替换或使用虚表调用吗? 为了弄清楚内联和虚函数,让我们将 ...

  4. UL LI 布局 TAB 切换条

    web页面实现tab的功能有几种实现方式,下面是使用UL LI DIV方式实现的tab. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  5. 图片url中包含中文导致网络请求404

    需要对其中的中文使用转换格式,注意不是整个url,如果是整个,"/"这个网络分隔符`也会被转换的 URLEncoder.encode("福利", "u ...

  6. APP-PER-50022: Oracle Human Resources could not retrieve a value for the User Type profile option.

    Symptoms ----------------------- AP > Setup > Organizations Show Error tips: APP-PER-50022: Or ...

  7. poj1691(dfs)

    链接 dfs了 写得有点乱 #include <iostream> #include<cstdio> #include<cstring> #include<a ...

  8. bzoj3796

    好像已经很久没有做后缀数组的题目,导致这种题一开始没想出来看到公共子串肯定想到后缀数组吧,但我都忘了最长公共子串怎么求了重要的性质:最长公共子串=max(h[i])名次相邻的两个后缀要分别属于s1,s ...

  9. 【转】was mutated while being enumerated 你是不是以为你真的懂For...in... ??

    原文网址:http://www.jianshu.com/p/ad80d9443a92 支持原创,如需转载, 请注明出处你是不是以为你真的懂For...in... ??哈哈哈哈, 我也碰到了这个报错 . ...

  10. NOIP2011普及组 瑞士环 保序性

    题目链接:http://noi.openjudge.cn/ch0401/4363/ 分析:如果直接模拟,时间复杂度是O(r*nlogn)超时 然后我们发现每次一轮开始时,刚开始是保序的,然后我们可以把 ...