BZOJ-1051 受欢迎的牛 Tarjan求强连通分量+缩点DAG
2016-03-24 21:31
381 查看
居然到现在才学Tarjan,真是太弱了
1051: [HAOI2006]受欢迎的牛
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3646 Solved: 1921
[Submit][Status][Discuss]
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
Source
利用Tarjan求强连通分量,将同个强连通分量缩成一个点,统计每个点的出度,当退化成树,即有解,输出即可否则为0
code:
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> using namespace std; int read() { int x=0,f=1; char ch=getchar(); while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();} while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();} return x*f; } #define maxn 100010 #define maxm 500010 int n,m; struct data{int from,to,next;}edge[maxm]; int head[maxn],cnt,tot,qcnt,num[maxn]; int dfn[maxn],low[maxn],outnum[maxn],belong[maxn]; bool visit[maxn]; void add(int u,int v) { cnt++; edge[cnt].from=u,edge[cnt].to=v; edge[cnt].next=head[u],head[u]=cnt; } int stack[maxn],st=0; void Tarjan(int x) { dfn[x]=low[x]=++tot; visit[x]=1; stack[++st]=x; for (int i=head[x]; i; i=edge[i].next) { if (!dfn[edge[i].to]) { Tarjan(edge[i].to); if (low[edge[i].to]<low[x]) low[x]=low[edge[i].to]; } else if(visit[edge[i].to] && dfn[edge[i].to]<low[x]) low[x]=dfn[edge[i].to]; } if (dfn[x]==low[x]) { qcnt++;int u; while (x!=u) u=stack[st--],num[qcnt]++, visit[u]=0,belong[u]=qcnt; } } int main() { n=read(),m=read(); int u,v; for (int i=1; i<=m; i++) u=read(),v=read(),add(u,v); for (int i=1; i<=n; i++) if (!dfn[i]) Tarjan(i); //for (int i=1; i<=n; i++) printf("%d ",belong[i]); puts(""); for (int i=1; i<=m; i++) if (belong[edge[i].from]!=belong[edge[i].to]) outnum[belong[edge[i].from]]++; int ans=0,an=0; for (int i=1; i<=qcnt; i++) if (!outnum[i]) ans=i,an++; if (an==1) printf("%d\n",num[ans]); else puts("0"); return 0; }
相关文章推荐
- 给出年、月、日,计算该日是该年的第几天
- 世界是数字的
- android中的style
- 数据库结构优化
- 提高Web页面性能的技巧
- 信息安全
- Unity3D与JSP TomCat服务器传递数据和文件( 二 ) Unity3D向java传输表单
- 「学习笔记」3.24代码学习
- [CTSC2007] 数据备份Backup
- ROS_OpenCV2_MatchTemplate模板匹配
- const修饰符所表示的含义
- SDUTOJ 2804求二叉树的深度
- sed简单用法示例
- spring四种依赖注入方式
- [bzoj2594][WC2006]水管局长数据加强版
- Scala学习8之排序算法比较和实现(scala)
- 加密算法类型
- CSS盒子模型与背景图片
- mysql数据库命令
- javascript中的数据类型检测