bzoj1051 [HAOI2006]受欢迎的牛[图论][tarjan缩点]
来源:互联网 发布:佳能wifi软件app 编辑:程序博客网 时间:2024/05/18 17:45
Description
每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被所有的牛认为是受欢迎的。
Input
第一行两个数N,M。 接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B)
Output
一个数,即有多少头牛被所有的牛认为是受欢迎的。
Sample Input
3 3
1 2
2 1
2 3
Sample Output
1
HINT
100%的数据N<=10000,M<=50000
以前所过一道tarjan缩点的题,觉得这类题还是比较简单。
易想到,这个图中会有多个强连通分量。如果一个强连通分类可以由任意一个另外的强连通分量到达(仰慕),且这种强连通分量只有一个的话(如果有多个会不满足上面那个条件),也就是这个强连通分量的入度为0。答案就是这个强连通分量的点的个数。tarjan缩点处理就行。
#include<queue>#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int head1[10005],head2[10005],tov1[50005],tov2[50005];int judge[10005],dfn[10005],low[10005],tot,stark[10005],dex;int nex1[50005],nex2[50005],num[10005],bcnt,belong[10005],step;void add1(int x,int y){ tov1[++tot]=y; nex1[tot]=head1[x]; head1[x]=tot;}void add2(int x,int y){ tov2[++tot]=y; nex2[tot]=head2[x]; head2[x]=tot;}void tarjan(int k){ stark[++step]=k; dfn[k]=low[k]=++dex; judge[k]=1; int t=head1[k]; while(tov1[t]) { if(!dfn[tov1[t]]) { tarjan(tov1[t]); low[k]=min(low[k],low[tov1[t]]); } else if(judge[tov1[t]]) low[k]=min(low[k],dfn[tov1[t]]); t=nex1[t]; } if(low[k]==dfn[k]) { bcnt++; int j=0; while(j!=k) { j=stark[step--]; judge[j]=0; belong[j]=bcnt; num[bcnt]++; } }}int main(){ int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int a,b; scanf("%d%d",&a,&b); add1(a,b); } for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); tot=0; for(int i=1;i<=n;i++) { int t=head1[i]; while(tov1[t]) { if(belong[i]!=belong[tov1[t]]) add2(belong[i],belong[tov1[t]]); t=nex1[t]; } } int ans=0,tmp; for(int i=1;i<=bcnt;i++) if(head2[i]==0) { ans++; tmp=i; } if(ans==1) printf("%d",num[tmp]); else printf("0"); return 0;}
1 0
- bzoj1051 [HAOI2006]受欢迎的牛[图论][tarjan缩点]
- 【bzoj1051】 [HAOI2006]受欢迎的牛 tarjan
- 【Tarjan】BZOJ1051(HAOI2006)[受欢迎的牛]题解
- [bzoj1051][HAOI2006]受欢迎的牛 Tarjan
- 【Tarjan】BZOJ1051 [HAOI2006]受欢迎的牛
- BZOJ1051 [HAOI2006]受欢迎的牛 tarjan
- BZOJ1051: [HAOI2006]受欢迎的牛(强连通Tarjan 缩点)
- [HAOI2006]受欢迎的牛 Tarjan缩点
- [BZOJ1051] [HAOI2006] 受欢迎的牛 - tarjan强连通分量
- bzoj1051 [HAOI2006]受欢迎的牛(tarjan求强连通分量)
- BZOJ1051(HAOI2006)[受欢迎的牛]--并查集+Tarjan
- Bzoj1051 haoi2006 受欢迎的牛
- bzoj1051 [HAOI2006]受欢迎的牛
- bzoj1051: [HAOI2006]受欢迎的牛
- [BZOJ1051][HAOI2006]受欢迎的牛
- BZOJ1051[HAOI2006]受欢迎的牛
- BZOJ1051: [HAOI2006]受欢迎的牛
- BZOJ1051 HAOI2006受欢迎的牛
- c中角度和弧度的转换
- BZOJ 1045 [HAOI2008] 糖果传递
- 第十一周项目1-验证二叉树算法(1)
- 第一次体验,也是学习也是锻炼!
- Unity 真实物理动力学实时计算
- bzoj1051 [HAOI2006]受欢迎的牛[图论][tarjan缩点]
- SpringMVC环境搭建问题:org.springframework.web.servlet.DispatcherServlet noHandlerFound
- iOS 判断网络连接状态的几种方法
- Android StringUtils-字符串相关工具类
- 最长回文子串
- BZOJ 2763 [JLOI2011]飞行路线
- SIFT和surf
- JQuery Date时间操作
- 原码、补码其实很简单