题意:给你一个连通图,问你最多加多少条边,还能保证该图不是强连通图。

对整个图求强连通分量,然后对图缩点,记录一下缩点之后每隔点包含的原来的点的个数,找出最少的那个点,然后对这个点建成完全图,对另外的所有点建成完全图。然后+两个点建边-所有原来的遍就好了。

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

 #include <iostream>
#include <vector>
#include <queue>
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <stack> using namespace std;
const int maxn = ; struct edge
{
int u,v,val;
};
int dfn[],low[],belong[],inst[];
int pnum[];
int in[];
int inside[];
int out[];
vector<edge> edges,es;
vector<int>g[maxn];
vector<int>ng[maxn];
stack<int>st;
int bcnt,cnt,dfsclock;
int max(int a,int b)
{
if(a > b)
return a; return b;
}
void init(int n)
{
int i;
for(i =;i <= n;i++)
g[i].clear(); edges.clear(); es.clear();
dfsclock = ;bcnt = cnt = ;
return ;
}
void addedge(int u,int v,int val)
{
edges.push_back((edge){u,v,});
g[u].push_back(cnt);
cnt++; return ;
}
void tarjan(int i)
{
int j;
dfn[i] = low[i] = ++dfsclock;
inst[i] = ;
st.push(i); for(j = ;j < g[i].size();j++)
{
edge e;
e = edges[g[i][j]];
int v;
v = e.v;
if(!dfn[v])
{
tarjan(v);
low[i] = min(low[i],low[v]);
}
else if(inst[v] && dfn[v] < low[i])
low[i] = dfn[v];
}
if(dfn[i] == low[i])
{
bcnt++;
do
{
j = st.top();
st.pop();
inst[j] = ;
belong[j] = bcnt; }
while(j != i);
} }
void tarjans(int n)
{
int i;
bcnt = dfsclock = ;
while(!st.empty())st.pop();
memset(dfn,,sizeof(dfn)); memset(inst,,sizeof(inst));
memset(belong,,sizeof(belong));
for(i = ;i <= n;i++)
if(!dfn[i])tarjan(i);
}
int main()
{
int n,m;
int t; scanf("%d",&t);
int cas = ;
while(t--)
{
scanf("%d %d",&n,&m);
int a,b,i;
init(n);
for(i = ;i < m;i++)
{
scanf("%d %d",&a,&b);
addedge(a,b,);
struct edge x;
x.u = a;
x.v = b;
x.val = ;
es.push_back(x); }
tarjans(n); printf("Case %d: ",++cas);
if(bcnt == )
{
puts("-1");
continue;
}
int pnum[];
int in[];
int out[];
memset(pnum,,sizeof(pnum));
memset(in,,sizeof(in));
memset(out,,sizeof(in));
memset(inside,,sizeof(inside));
for(i = ;i <= n;i++)
{
pnum[belong[i]]++;
} for(i = ;i < m;i++)
{
int u,v;
u = es[i].u;
v = es[i].v;
if(belong[u] != belong[v])
{
out[belong[u]]++;
in[belong[v]]++;
}
}
__int64 ans;
ans = n; for(i = ;i <= bcnt;i++)
{
if(in[i] == || out[i] == )
{
if(ans > pnum[i])
ans = pnum[i];
}
} ans = (__int64)(n-ans)* (__int64)(n-ans-)+ (__int64)ans* (__int64)(ans-)+ (__int64)ans*(__int64)(n-ans)- (__int64)(m);
// printf("bcnt %d p %d ams %d ansi %d\n",bcnt,pnum[ansi],ans,ansi); printf("%I64d\n",ans); }
return ;
}

Strongly connected 挺简单的tarjan的更多相关文章

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

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

  2. PTA Strongly Connected Components

    Write a program to find the strongly connected components in a digraph. Format of functions: void St ...

  3. algorithm@ Strongly Connected Component

    Strongly Connected Components A directed graph is strongly connected if there is a path between all ...

  4. Strongly connected(hdu4635(强连通分量))

    /* http://acm.hdu.edu.cn/showproblem.php?pid=4635 Strongly connected Time Limit: 2000/1000 MS (Java/ ...

  5. HDU4625:Strongly connected(思维+强连通分量)

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

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

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

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

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

  8. cf475B Strongly Connected City

    B. Strongly Connected City time limit per test 2 seconds memory limit per test 256 megabytes input s ...

  9. 【CF913F】Strongly Connected Tournament 概率神题

    [CF913F]Strongly Connected Tournament 题意:有n个人进行如下锦标赛: 1.所有人都和所有其他的人进行一场比赛,其中标号为i的人打赢标号为j的人(i<j)的概 ...

随机推荐

  1. JS获取节点方法

    1. 通过顶层document节点获取:(1) document.getElementById(elementId):该方法通过节点的ID,可以准确获得需要的元素,是比较简单快捷的方法.如果页面上含有 ...

  2. 请教DotNetBar控件中的CalendarView控件如何拖动当前的时间轴

    本人想拖动那个当前的时间轴或者让时间轴变动,因为那个时间轴默认的是当前时间.(就是那个黄色的线)

  3. iOS第三方解决键盘遮挡-IQKeyboardManager

    百度云:http://pan.baidu.com/s/1yg5ae githun:https://github.com/hackiftekhar/IQKeyboardManager AppDelega ...

  4. 二叉查找树的查找、插入和删除 - Java实现

    http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html 作者: yangecnu(yangecnu's Blog on ...

  5. DAL层与BLL层的设计原则

    通用DAL层: 提供一个通用的DAL层的基础框架,其中包括所有实体类的基类,所有DAL类的基类,以及用来在实体类和数据表以及实体类字段和数据表字段之间Mapping的Attributes.此层作为核心 ...

  6. lintcode:二叉树的所有路径

    二叉树的所有路径 给一棵二叉树,找出从根节点到叶子节点的所有路径. 样例 给出下面这棵二叉树: 1 / \ 2 3 \ 5 所有根到叶子的路径为: [ "1->2->5" ...

  7. Facebook揭密:如何让MySQL数据库集群自主运行

    Facebook运行着全球最大的MySQL数据库集群,该集群分布在两个大洲上的多个数据中心中数以千计的服务器上.让人不解的是,Facebook只动用了一个很小的团队来管理这个庞大的MySQL数据库集群 ...

  8. java中String,StringBuffer,StringBuilder之间的区别

    文章转载自:http://www.cnblogs.com/frankliiu-java/archive/2010/07/05/1771537.html String是固定长度的字符串,如果要发生变化必 ...

  9. GSM、3G、LTE、4G

    3GPP(The 3rd Generation Partnership Project)3GPP的目标是实现由2G网络到3G网络的平滑过渡,保证未来技术的后向兼容性,支持轻松建网及系统间的漫游和兼容性 ...

  10. C/C++类型转换

    1.隐式类型转换 1.1 隐式类型转换的规则 K & R A.6.5 Arithmetic Conversions(数值型间的转换)First, if either operand is lo ...