[强联通] bzoj1051 受欢迎的牛
2017-06-20 16:55
218 查看
bzoj1051 受欢迎的牛
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
有向边…强联通啊(恶补强联通)
用强联通来把能联通的缩点
最后如果只有一个点只有入度没有出度的话
这头牛就是最受欢迎的牛了
很裸把?~
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
有向边…强联通啊(恶补强联通)
用强联通来把能联通的缩点
最后如果只有一个点只有入度没有出度的话
这头牛就是最受欢迎的牛了
很裸把?~
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; struct node { int x,y,next; }a[51000]; int last[110000],len,n,m,ans,anst; int dfn[110000],low[110000],sta[110000],belong[110000]; int id,cnt,top; bool v[110000]; int chu[110000]; void build(int x,int y)//建边 { len++; a[len].x=x;a[len].y=y;a[len].next=last[x];last[x]=len; } void dfs(int x) { dfn[x]=low[x]=++id; sta[++top]=x;v[x]=true; for (int k=last[x];k;k=a[k].next) { int y=a[k].y; if (dfn[y]==-1)//没有dfs过就做一遍 { dfs(y); if (low[x]>low[y]) low[x]=low[y]; } else//dfs过就看看是否比现在认的老大还要小(是否在一个连通块中) { if (v[y]) low[x]=min(low[x],low[y]); } } if (low[x]==dfn[x])//自己就是老大 { int i; cnt++; do { i=sta[top--];//出栈 v[i]=false; belong[i]=cnt;//故名思议"属于" } while (i!=x); } } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { int x,y; scanf("%d%d",&x,&y); build(x,y); } memset(v,false,sizeof(v)); memset(dfn,-1,sizeof(dfn)); for (int i=1;i<=n;i++) { if (dfn[i]==-1) dfs(i); } for (int i=1;i<=m;i++) { if (belong[a[i].x]!=belong[a[i].y]) chu[belong[a[i].x]]++;//统计出度 } for (int i=1;i<=cnt;i++) { if (chu[i]==0) {ans++;anst=i;} } if (ans!=1) {printf("0");return 0;} ans=0; for (int i=1;i<=n;i++) { if (belong[i]==anst) ans++; } printf("%d",ans); return 0; }
相关文章推荐
- _bzoj1051 [HAOI2006]受欢迎的牛【强联通】
- 【强联通分量缩点】【Tarjan】bzoj1051 [HAOI2006]受欢迎的牛
- 【BZOJ】1051 [HAOI2006]受欢迎的牛 强联通分量
- [BZOJ1051]HAOI2006受欢迎的牛|强联通分量
- [BZOJ1051][HAOI2006] 受欢迎的牛 tarjan求联通分量
- bzoj 1051 HAOI2006 受欢迎的牛 强联通分量+拓扑排序
- bzoj1051: [HAOI2006]受欢迎的牛(强联通)
- 【bzoj 1051】 [HAOI2006]受欢迎的牛 强联通分量
- 【连通分量】BZOJ 1051:[HAOI2006]受欢迎的牛
- bzoj1051【HAOI2006】受欢迎的牛
- BZOJ1051: [HAOI2006]受欢迎的牛(强连通Tarjan 缩点)
- BZOJ-1051 受欢迎的牛
- [bzoj1051][HAOI2006]受欢迎的牛——强连通分量
- [题解]bzoj1051(HAOI2006)受欢迎的牛
- 【BZOJ】1051: [HAOI2006]受欢迎的牛(tarjan)
- [Bzoj1051][HAOI2006]受欢迎的牛(缩环)
- bzoj 1051: [HAOI2006]受欢迎的牛(tarjan 缩点)
- bzoj1051:受欢迎的牛(tarjan)
- BZOJ[1051][HAOI2006]受欢迎的牛 Tarjan缩点
- 受欢迎的牛bzoj1051(浅谈tarjan——(3))