列表

详情


NC50391. 受欢迎的牛

描述

每一头牛的愿望就是变成一头最受欢迎的牛。现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎。这种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也认为牛C受欢迎。你的任务是求出有多少头牛被除自己之外的所有牛认为是受欢迎的。

输入描述

第一行两个数N,M;
接下来M行,每行两个数A,B,意思是A认为B是受欢迎的(给出的信息有可能重复,即有可能出现多个A,B)。

输出描述

输出被除自己之外的所有牛认为是受欢迎的牛的数量。

示例1

输入:

3 3
1 2
2 1
2 3

输出:

1

说明:

只有第三头牛被除自己之外的所有牛认为是受欢迎的。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(clang++ 11.0.1) 解法, 执行用时: 14ms, 内存消耗: 1152K, 提交时间: 2023-07-20 14:41:22

#include<stdio.h>
#include<cstring>
int N,M,B,csc,t,p,k,j=1,i=1,d[10002],sz[10002],sc[10002],lw[10002],dfn[10002],hd[10002],A[50002],nxt[50002];
void tj(int x){
	int y,p=hd[x];
	for(dfn[d[++k]=x]=lw[x]=++i;p;p=nxt[p])y=A[p],dfn[y]?lw[x]=sc[y]||lw[x]<dfn[y]?lw[x]:dfn[y]:(tj(y),lw[x]=lw[y]<lw[x]?lw[y]:lw[x]);
	if(lw[x]==dfn[x])for(++csc;k&&t-x;)++sz[sc[t=d[k--]]=csc];
}
int main(){
	for(scanf("%d%d",&N,&M);i<=M;hd[B]=i++)scanf("%d%d",&A[i],&B),nxt[i]=hd[B];
	for(i=0;j<=N;++j)if(!dfn[j])tj(j);
	for(memset(d,0,sizeof(d)),i=1;i<=N;++i)for(p=hd[i];p;p=nxt[p])t=sc[A[p]],d[t]+=sc[i]!=t;
	for(k=-1,i=1;i<=csc;k+=!d[i++])t=d[i]?t:i;
	printf("%d",k?0:sz[t]);
}

C++(g++ 7.5.0) 解法, 执行用时: 12ms, 内存消耗: 1672K, 提交时间: 2023-07-20 20:04:44

#include<stdio.h>
#include<cstring>
int N,M,B,csc,t,k,j=1,i=1,d[10002],sc[10002],sz[10002],lw[10002],dfn[10002],hd[10002],A[50002],nxt[50002];
void tj(int x){
	int y,p=hd[x];
	for(dfn[d[++k]=x]=lw[x]=++i;p;p=nxt[p])y=A[p],dfn[y]?lw[x]=sc[y]||lw[x]<dfn[y]?lw[x]:dfn[y]:(tj(y),lw[x]=lw[y]<lw[x]?lw[y]:lw[x]);
	if(dfn[x]==lw[x])for(++csc;t-x;)++sz[sc[t=d[k--]]=csc];
}
int main(){
	for(scanf("%d%d",&N,&M);i<=M;hd[B]=i++)scanf("%d%d",&A[i],&B),nxt[i]=hd[B];
	for(i=0;j<=N;++j)if(!dfn[j])tj(j);
	for(memset(d,0,sizeof(d)),i=1;i<=N;++i)for(j=hd[i];j;j=nxt[j])d[t=sc[A[j]]]+=sc[i]!=t;
	for(k=-1,i=1;i<=csc;++i)if(!d[i])++k,t=i;
	printf("%d",sz[k?0:t]);
}

上一题