HDU 3836 - Equivalent Sets【强连通分量 基础题】
2016-03-12 14:52
381 查看
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
特别特别水的强连通分量 关于强连通分量的讲解参考这篇博客,都是很裸的== 敲完刘汝佳书上二档模板就1A了
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.
特别特别水的强连通分量 关于强连通分量的讲解参考这篇博客,都是很裸的== 敲完刘汝佳书上二档模板就1A了
#include<cstdio> #include<cstring> #include<vector> #include<stack> using namespace std; #define maxn 20000 vector<int>G[maxn]; int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt; stack<int>S; int min(int a,int b){if(a<b)return a;return b;} void dfs(int u) { pre[u]=lowlink[u]=++dfs_clock; S.push(u); for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(!pre[v]) { dfs(v); lowlink[u]=min(lowlink[u],lowlink[v]); } else if(!sccno[v]) lowlink[u]=min(lowlink[u],pre[v]); } if(lowlink[u]==pre[u]) { scc_cnt++; for(;;) { int x=S.top();S.pop(); sccno[x]=scc_cnt; if(x==u) break; } } } void find_scc(int n) { dfs_clock=scc_cnt=0; memset(sccno,0,sizeof(sccno)); memset(pre,0,sizeof(pre)); for(int i=0;i<n;i++) if(!pre[i]) dfs(i); } int in0[maxn],out0[maxn]; int main() { int T,n,m; while(~scanf("%d%d",&n,&m)) { for(int i=0;i<n;i++) G[i].clear(); for(int i=0;i<m;i++) { int u,v; scanf("%d%d",&u,&v); u--;v--; G[u].push_back(v); } find_scc(n); for(int i=1;i<=scc_cnt;i++)in0[i]=out0[i]=1; for(int u=0;u<n;u++) { for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(sccno[u]!=sccno[v])in0[sccno[v]]=out0[sccno[u]]=0; } } int a=0,b=0; for(int i=1;i<=scc_cnt;i++) { if(in0[i])a++; if(out0[i]) b++; } int ans=a; if(ans<b) ans=b; if(scc_cnt==1) ans=0; printf("%d\n",ans); }return 0; }
相关文章推荐
- UItabBarController
- QBImagePicker用法详解
- quick 3.3 display.newColorLayer setContentSize
- Debian安装Arduino IDE
- CodeForces - 622A Infinite Sequence (思想)水
- Codeforces--622A--Infinite Sequence(数学)
- Codeforces--622A--Infinite Sequence(数学)
- 《NumPy Beginner's Guide》笔记Chapter2
- UI控件--UIImageView
- UVa 540 - Team Queue
- 《iOS Human Interface Guidelines》——Image View
- 对于League of Legends的分析
- Hibernate之Query接口的uniqueResult()方法
- UIviewcontroller与UIview
- [手游新项目历程]第3天-fatal error LNK1000: Internal error during IncrBuildImage
- iOS上传失败提示"Request failed: unacceptable content-type: text/html"
- String,StringBuffer与StringBuilder之间的区别
- UIscrollView和UIPageControl的循环滚动
- MYSQL的索引类型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么区别?各适用于什么场合?
- Easyui datebox 限制时间选择范围