博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Poj 2186 Popular Cows
阅读量:5096 次
发布时间:2019-06-13

本文共 3089 字,大约阅读时间需要 10 分钟。

Popular Cows

Time Limit: 2000MS Memory Limit: 65536K
Total Submissions: 29240 Accepted: 11831
Description
Every cow’s dream is to become the most popular cow in the herd. In a herd of N (1 <= N <= 10,000) cows, you are given up to M (1 <= M <= 50,000) ordered pairs of the form (A, B) that tell you that cow A thinks that cow B is popular. Since popularity is transitive, if A thinks B is popular and B thinks C is popular, then A will also think that C is
popular, even if this is not explicitly specified by an ordered pair in the input. Your task is to compute the number of cows that are considered popular by every other cow.
Input
* Line 1: Two space-separated integers, N and M
* Lines 2..1+M: Two space-separated numbers A and B, meaning that A thinks B is popular.
Output
* Line 1: A single integer that is the number of cows who are considered popular by every other cow.
Sample Input
3 3
1 2
2 1
2 3
Sample Output
1
Hint
Cow 3 is the only cow of high popularity.
Source
USACO 2003 Fall

/*Tarjan模板+缩点 */#include
#include
#include
#define MAXN 50001using namespace std;struct data{ int v,next;}e[MAXN];int n,m,cut,belong[MAXN],head[MAXN],dfn[MAXN],stack[MAXN],low[MAXN],in[MAXN],top,tot;void init(){ cut=tot=top=0; memset(head,-1,sizeof(head)); memset(stack,0,sizeof(stack)); memset(dfn,0,sizeof(dfn)); memset(low,0,sizeof(low)); memset(in,0,sizeof(in));}void add_edge(int u,int v){ e[tot].v=v; e[tot].next=head[u]; head[u]=tot++;}void tarjan(int u){ int v; low[u]=dfn[u]=++cut; in[u]=1;//当前节点进栈 stack[top++]=u; for(int i=head[u];i!=-1;i=e[i].next)//遍历边 { v=e[i].v; if(!dfn[v])//未被访问 { tarjan(v); low[u]=min(low[u],low[v]); } else if(in[v]) { low[u]=min(low[u],dfn[v]); } } if(dfn[u]==low[u])//找到一个强联通分量的根 { tot++; do { v=stack[--top];//退栈 in[v]=0; belong[v]=tot;//tot为连通分量编号 } while(u!=v); }}int main(){ while(scanf("%d %d",&n,&m)!=EOF) { int x,y; init(); for(int i=1;i<=m;i++) { cin>>x>>y; add_edge(x,y); } tot=0; for(int i=1;i<=n;i++) { if(!dfn[i]) tarjan(i); } int out[MAXN]={
0},u,v; for(int i=1;i<=n;i++) { for(int j=head[i];j!=-1;j=e[j].next) { u=belong[i],v=belong[e[j].v]; if(u!=v) out[u]++; } } int flag=0; for(int i=1;i<=tot;i++) { if(!out[i])//找出度为0的连通块 { flag++; x=i; } } if(flag>1) printf("0\n"); else { int ans=0; for(int i=1;i<=n;i++) { if(belong[i]==x)//属于该连通块的点即为答案的贡献 ans++; } printf("%d\n",ans); } } return 0;}

转载于:https://www.cnblogs.com/nancheng58/p/6070852.html

你可能感兴趣的文章
mybaits注解
查看>>
Codeforces Round #416 (Div. 2) A+B
查看>>
malloc和new有什么区别
查看>>
动态规划----最长公共子序列(C++实现)
查看>>
轻松搞定面试中的二叉树题目
查看>>
How to detect when a list is scrolling (or not)
查看>>
The method getDispatcherType() is undefined for the type HttpServletRequest
查看>>
如何在Mac上切换python2和python3以及下载安装包 & 在Mac上如何查找系统自带python2.7的路径...
查看>>
[leetcode]26.Remove Duplicates from Sorted Array
查看>>
PAT 甲级 1146 Topological Order
查看>>
校招准备-编程语言
查看>>
oracle 循环插入
查看>>
ACM-ICPC(9/25)
查看>>
沉淀再出发:redis的安装和使用
查看>>
Oracle 安装OEM 报错: 无法对所有EM 相关账户解锁 解决方法
查看>>
遗传算法(一)
查看>>
word之论文摘要
查看>>
GitHub
查看>>
密码学趣谈
查看>>
菜根谭#194
查看>>