hdu 2767
这也是道强连通分量的题;
题目要求我们求出最少需要添加多少条边让整个图变成一个强连通分量;
思路很简单,直接缩点,然后找出所有点中有多少出度为0,入度为0的点,最大的那个就是题目所求;
贴代码:
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#include<stack>
#define maxn 50005
using namespace std;
vector<int>ve[maxn];
int dfn[maxn],low[maxn],ans,n,m,nncount,b[maxn];
int from[maxn],to[maxn],cntin[maxn],cntout[maxn];
bool instack[maxn];
stack<int>q; void tarjin(int x)
{
dfn[x]=low[x]=++nncount;
instack[x]=;
q.push(x);
int l=ve[x].size();
for(int i=; i<l; i++)
{
int v=ve[x][i];
if(!dfn[v])
{
tarjin(v);
low[x]=min(low[x],low[v]);
}
else if(instack[v])
low[x]=min(low[x],dfn[v]);
}
if(low[x]==dfn[x])
{
ans++;
int v;
do
{
v=q.top();
q.pop();
b[v]=ans;
instack[v]=;
}while(v!=x);
}
} int main()
{
int x,y,t,mm1,mm2;
scanf("%d",&t);
while(t--)
{
memset(cntin,,sizeof cntin);
memset(cntout,,sizeof cntout);
memset(b,,sizeof b);
memset(dfn,,sizeof dfn);
memset(low,,sizeof low);
scanf("%d%d",&n,&m);
for(int i=; i<=n; i++)
{
ve[i].clear();
instack[i]=;
}
while(!q.empty()) q.pop();
for(int i=; i<=m; i++)
{
scanf("%d%d",&x,&y);
ve[x].push_back(y);
from[i]=x,to[i]=y;
}
nncount=ans=mm1=mm2=;
for(int i=; i<=n; i++)
if(!dfn[i]) tarjin(i);
if(ans==){printf("0\n");continue;}
for(int i=;i<=m;i++)
{
x=b[from[i]],y=b[to[i]];
if(x!=y) cntout[x]++,cntin[y]++;
}
for(int i=;i<=ans;i++)
{
if(!cntin[i]) mm1++;
if(!cntout[i]) mm2++;
}
printf("%d\n",max(mm1,mm2));
}
return ;
}
hdu 2767的更多相关文章
- 有向图 加最少的边 成为强连通分量的证明 poj 1236 hdu 2767
poj 1236: 题目大意:给出一个有向图, 任务一: 求最少的点,使得从这些点出发可以遍历整张图 任务二: 求最少加多少边 使整个图变成一个强连通分量. 首先任务一很好做, 只要缩点 之后 求 ...
- HDU 2767:Proving Equivalences(强连通)
http://acm.hdu.edu.cn/showproblem.php?pid=2767 题意:给出n个点m条边,问在m条边的基础上,最小再添加多少条边可以让图变成强连通.思路:强连通分量缩点后找 ...
- HDU 2767 Proving Equivalences (强联通)
pid=2767">http://acm.hdu.edu.cn/showproblem.php?pid=2767 Proving Equivalences Time Limit: 40 ...
- hdu 2767 Proving Equivalences(tarjan缩点)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2767 题意:问最少加多少边可以让所有点都相互连通. 题解:如果强连通分量就1个直接输出0,否者输出入度 ...
- 强联通 HDU 2767 3836
n个点m条边 最少需要几条边变成强连通图 设有a个结点的入读为0, b个结点的出度为0, 则 max{a, b}就是答案. 注意特殊情况: 当原图已经强连通时, 答案是0而不是1. 加一条边少一个入度 ...
- hdu 2767 Proving Equivalences
Proving Equivalences 题意:输入一个有向图(强连通图就是定义在有向图上的),有n(1 ≤ n ≤ 20000)个节点和m(0 ≤ m ≤ 50000)条有向边:问添加几条边可使图变 ...
- hdu 2767 Proving Equivalences 强连通缩点
给出n个命题,m个推导,问最少添加多少条推导,能够使全部命题都能等价(两两都能互推) 既给出有向图,最少加多少边,使得原图变成强连通. 首先强连通缩点,对于新图,每一个点都至少要有一条出去的边和一条进 ...
- HDU 2767 Proving Equivalences(至少增加多少条边使得有向图变成强连通图)
Proving Equivalences Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Oth ...
- HDU 2767 Proving Equivalences (Tarjan)
Proving Equivalences Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other ...
随机推荐
- Python 基础【第二篇】python操作模式
一.交互模式 #python Python 2.6.6 (r266:84292, Jan 22 2014, 09:42:36) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4 ...
- HDU-1031(水题)
Design T-Shirt Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) P ...
- mysql自增
主键设置自增,同时主键需要是int类型
- hibernate篇章二--成就搭建hibernate框架
在网上的资料很多,但是成功搭建一个Hibernate框架的很少,下面我将用一个简单的例子成功搭建一个Hibernate框架给大伙瞧瞧 该链接中有源代码和数据库,例子很简单,只是往数据库中的person ...
- netMVC 搭建Ucenter 同步登陆退出discuz
先看一下效果
- CSS3兼容IE的大杀器
经过长久以来的不懈努力,我终于成功的将selectivizr与PIE这两个解决css3的利器进行了深度的整合,大大降低了使用难度 <!--[if lte IE 9]><script ...
- Android开发之ViewPager
什么是ViewPager? ViewPager是安卓3.0之后提供的新特性,继承自ViewGroup,专门用以实现左右滑动切换View的效果. 如果想向下兼容就必须要android-support-v ...
- 本机Font字体
void getFontList() { GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); Str ...
- 总结Qt中经常出现的一些问题
1.Qt中用高版本打开低版本的工程 编译时出现错误 : C1189: #error : "This file was generated using the moc from 4.7.0. ...
- iOS-开发日志-UITextView介绍
UITextView 属性 1. text: 设置textView中文本 _textView.text = @"Now is the time for all good develo ...