hdoj3836Equivalent Sets【scc +缩点】

原创 2015年11月19日 21:08:16



Equivalent Sets

Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 104857/104857 K (Java/Others)
Total Submission(s): 3619    Accepted Submission(s): 1262


Problem Description
To prove two sets A and B are equivalent, we can first prove A is a subset of B, and then prove B is a subset of A, so finally we got that these two sets are equivalent.
You are to prove N sets are equivalent, using the method above: in each step you can prove a set X is a subset of another set Y, and there are also some sets that are already proven to be subsets of some other sets.
Now you want to know the minimum steps needed to get the problem proved.
 

Input
The input file contains multiple test cases, in each case, the first line contains two integers N <= 20000 and M <= 50000.
Next M lines, each line contains two integers X, Y, means set X in a subset of set Y.
 

Output
For each case, output a single integer: the minimum steps needed.
 

Sample Input
4 0 3 2 1 2 1 3
 

Sample Output
4 2
Hint
Case 2: First prove set 2 is a subset of set 1 and then prove set 3 is a subset of set 1.
 

Source
 


题意:计算需要加多少边才能构成一个强连通图注意给的图本身就是一个强连通图的情况

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
#include<stack>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=100010;
int dfs_clock,scc_cnt;
int head[maxn];
int sccno[maxn];
int low[maxn],dfn[maxn];
bool instack[maxn];
int in[maxn],out[maxn];
stack<int>S;
vector<int>scc[maxn];
vector<int>G[maxn];
struct Node{
	int from,to,next;
}A[maxn];
int MAX(int a,int b){
	return a>b?a:b;
}
int MIN(int a,int b){
	return a<b?a:b;
}
void init(){
	dfs_clock=scc_cnt=0;
	memset(head,-1,sizeof(head));
	memset(sccno,0,sizeof(sccno));
	memset(instack,false,sizeof(instack));
	memset(in,0,sizeof(in));
	memset(out,0,sizeof(out));
	memset(low,0,sizeof(low));
	memset(dfn,0,sizeof(dfn));
}
void tarjan(int u,int pre){
	int v;
	dfn[u]=low[u]=++dfs_clock;
	S.push(u);instack[u]=true;
	for(int k=head[u];k!=-1;k=A[k].next){
		v=A[k].to;
		if(!dfn[v]){
			tarjan(v,u);
			low[u]=MIN(low[u],low[v]);
		}
		else if(instack[v]){
			low[u]=MIN(low[u],dfn[v]);
		}
	}
	if(low[u]==dfn[u]){
		scc_cnt++;scc[scc_cnt].clear();
		G[scc_cnt].clear();
		while(1){
			v=S.top();S.pop();
			instack[v]=false;
			scc[scc_cnt].push_back(v);
			sccno[v]=scc_cnt;
			if(u==v)break;
		}
	}
}
void suodian(int m){
	for(int i=0;i<m;++i){
		int u=sccno[A[i].from];
		int v=sccno[A[i].to];
		if(u!=v){
			G[u].push_back(v);
			in[v]++;out[u]++;
		}
	}
}
int main()
{
	int i,j,k,n,m;
	while(scanf("%d%d",&n,&m)!=EOF){
		init();
		for(i=0;i<m;++i){
			scanf("%d%d",&A[i].from,&A[i].to);
			A[i].next=head[A[i].from];
			head[A[i].from]=i;
		}
		for(i=1;i<=n;++i){
			if(!dfn[i]){
				tarjan(i,-1);
			}
		}
		if(scc_cnt==1){
			printf("%d\n",0);
			continue;
		}
		suodian(m);
		int ans1=0,ans2=0;
		for(i=1;i<=scc_cnt;++i){
			if(in[i]==0)ans1++;
			if(out[i]==0)ans2++;
		}
		printf("%d\n",MAX(ans1,ans2));
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU 3836--Equivalent Sets【求有向图最少增加多少边使图强连通 && Scc缩点新建图】

Equivalent Sets Time Limit: 12000/4000 MS (Java/Others)    Memory Limit: 104857/104857 K (Java/Othe...

POJ 1236 Network of Schools HDU 3836 Equivalent Sets 强连通分量+缩点 tarjan or kosaraju

1,POJ 1236 有一些学校连接到一个计算机网络,这些学校之间达成了一个协议:每个学校维护着一个学校列表,它向学校列表中的学校发布软件。注意,如果学校B在学校A的列表中,则A不一定在B的列表中。...

HDU 3836 Equivalent Sets(强连通分量 Tarjan缩点)

Tarjan求强连通分量详解在前一篇文章 把一个有向图变为强连通分量至少要加几条边? Tarjan缩点后,设a为入度为0的点数,b为出度为0的点数,答案max(a,b)。 注意:如果图本...

hdu 3836 Equivalent Sets 强联通 tarjan缩点

求强连通分量,然后统计每一个分量的入度和初度 这两个量中较大的那一个就是答案了

HDOJ/HDU 3836 Equivalent Sets

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3836 Problem DescriptionTo prove two sets A and B are...

HDU 3836 — Equivalent Sets

原题:http://acm.hdu.edu.cn/showproblem.php?pid=3836 题意:给出一个有向图,问最少加几条边使得该图强连通; 思路:先求出所有的强连通分量,计算新图中入...

HDU 3836 Equivalent Sets(强连通分量)

题目链接:点击打开链接 思路:强连通分量模板题, 把一个强连通分量的缩成一个点, 构建一张新图。 然后在新图上, 求每个点的入度和出度。 假设有a个顶点的入度为0,b个顶点的出度为0,那么可以证明答...

HDU 3836 Equivalent Sets 强连通分量

题意:让所有点强连通需要最少连多少条边?思路:缩点,求出每个强连通分量的入度和出度,如果强连通分量的入度为0,则incnt++,如果强连通分量的出度为0,则outcnt++,取max(incnt,ou...

hdu3836 Equivalent Sets

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3836; 题意:大致是给一个有向图,问加几条边能成为强连通图。 分析:先对此图进行强连通分量求解,然...

HDU3836 Equivalent Sets 2011 Multi-University Training Contest 1 - Host by HNU

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=3836题目大意:给出一个有向图,求最少添加多少条边使得该图变成强连通图。首先如果图本身就是强连通那么答案...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)