[BZOJ 1051][HAOI 2006]受欢迎的牛(tarjan缩点)
来源:互联网 发布:手机淘宝如何看退款率 编辑:程序博客网 时间:2024/05/20 15:42
http://www.lydsy.com:808/JudgeOnline/problem.php?id=1051
唔。。。这题好像在POJ上见过?
比较水的题,很好想出思路。牛和牛之间的关系就像有向图,牛a喜欢牛b相当于建立有向边a->b,然后在这个有向图中,每个强连通分量里的牛们相当于是相互喜欢的,把这个图缩点成DAG,DAG里如果有且仅有一个出度为0的点,则这个点对应强连通分量里的所有牛都是受欢迎的牛,如果没有出度为0的点,当然就没受欢迎的牛了,如果出度为0的点的个数大于1,则每个出度为0的强连通分量里的牛喜欢的粉丝个数就会不到n-1个,也没有受欢迎的牛。
题目有点坑,貌似题面上标的数据范围小了,被坑WA了一次。
#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <stdlib.h>#define MAXE 100050#define MAXV 500050using namespace std;struct edge{ int u,v,next;}edges[MAXE];int n,m;int head[MAXV],nCount=0;int low[MAXV],dfn[MAXV],belong[MAXV],stack[MAXV],top=0;int cnt=0,tot=0; //tot=强连通分量个数int num[MAXV],outDegree[MAXV]; //num[i]=第i号强连通分量里的点个数,outDegree=出度bool visit[MAXV];void AddEdge(int U,int V){ edges[++nCount].u=U; edges[nCount].v=V; edges[nCount].next=head[U]; head[U]=nCount;}void tarjan(int u) //tarjan缩点{ low[u]=dfn[u]=++cnt; stack[++top]=u; visit[u]=true; for(int p=head[u];p!=-1;p=edges[p].next) { int v=edges[p].v; if(!dfn[v]) { tarjan(v); low[u]=min(low[u],low[v]); } else if(visit[v]) low[u]=min(low[u],dfn[v]); } if(dfn[u]==low[u]) { tot++; int v=-1; while(u!=v) { v=stack[top--]; belong[v]=tot; num[tot]++; visit[v]=false; } }}int main(){ memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); AddEdge(u,v); } for(int i=1;i<=n;i++) if(!dfn[i]) tarjan(i); for(int i=1;i<=m;i++) if(belong[edges[i].u]!=belong[edges[i].v]) outDegree[belong[edges[i].u]]++; int res=0,ans; //res=出度为0的点的个数,ans=出度为0的强连通分量编号 for(int i=1;i<=tot;i++) if(outDegree[i]==0) { res++; ans=i; } if(res==1) printf("%d\n",num[ans]); else printf("0\n"); return 0;}
0 0
- [BZOJ 1051][HAOI 2006]受欢迎的牛(tarjan缩点)
- BZOJ 1051 [HAOI 2006]受欢迎的牛 (图的联通,tarjan)
- bzoj 1051: [HAOI2006]受欢迎的牛(tarjan 缩点)
- 【bzoj 1051】[HAOI2006]受欢迎的牛(Tarjan缩点)
- Tarjan缩点 BZOJ 1051 受欢迎的牛
- BZOJ[1051][HAOI2006]受欢迎的牛 Tarjan缩点
- HAOI-2006 受欢迎的牛
- BZOJ-1051 受欢迎的牛 Tarjan求强连通分量+缩点DAG
- BZOJ 1051: [HAOI2006]受欢迎的牛 强连通分量,Tarjan缩点
- [BZOJ 1051][POJ 2186] 受欢迎的牛/Popular Cows Tarjan缩点+判断出度
- 【tarjan】BZOJ 1051:受欢迎的牛
- 【BZOJ 1051】 受欢迎的牛 【Tarjan】
- BZOJ 1051 [HAOI2006]受欢迎的牛 tarjan
- [HAOI2006]受欢迎的牛 Tarjan缩点
- bzoj 1051[HAOI2006]受欢迎的牛|tarjan|水题
- BZOJ 1051 || POJ 2186 受欢迎的牛 Tarjan
- [Tarjan]BZOJ 1051—— [HAOI2006]受欢迎的牛
- bzoj1051 [HAOI2006]受欢迎的牛[图论][tarjan缩点]
- CodeForces 489E Hiking
- java或jsp中把图片转成Base64编码在转成新的图片
- bzoj 3339: Rmq Problem
- printf函数对参数的计算顺序,是从右往左的
- 第十四周上机项目2--(2) 带姓名的成绩单 按同学姓名排序
- [BZOJ 1051][HAOI 2006]受欢迎的牛(tarjan缩点)
- 每个Android开发者必须知道的内存管理知识
- HTML
- 打客服、重装系统都无解,苹果mac电脑各种程序无响应的最终解决办法
- Java字符串学习笔记
- asp.net动态添加下拉列表框
- 第十四周项目三:多课成绩单
- Linux软件的安装与卸载方法
- Android - 控件android:ems属性