如果几头奶牛互相喜欢,那么我们就可把他们视为一个强连通分量,然后缩点。
此时出度为0的点为最受明星牛,但如果出度为0的点超过了一个那么就无法做到有奶牛被所有人喜欢
代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+5;
const int maxm=5e4+5;
int n,m,cnt,ans,ux[maxm],uy[maxm],dfn[maxn],low[maxn],head[maxn];
int times,quan[maxn],tot,col[maxn],top,que[maxn],inin[maxn],out[maxn];
struct edge
{
int to,nxt;
}G[maxm];
void add(int x ,int y)
{
G[++cnt].to=y; G[cnt].nxt=head[x]; head[x]=cnt;
}
void tarjan(int x)
{
que[++top]=x;
inin[x]=1;
dfn[x]=low[x]=++times;
for(int i=head[x];i;i=G[i].nxt)
{
int to=G[i].to;
if(!dfn[to])
{
tarjan(to);
low[x]=min(low[x],low[to]);
}
else if(inin[to]) low[x]=min(low[x],dfn[to]);
}
if(low[x]==dfn[x])
{
tot++;
while(que[top+1]!=x)
{
++quan[tot];
col[que[top]]=tot;
inin[que[top--]]=0;
}
}
}
int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&ux[i],&uy[i]);
add(ux[i],uy[i]);
}
for(int i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
for(int i=1;i<=m;i++)
if(col[ux[i]]!=col[uy[i]])
out[col[ux[i]]]++;
int flag=0;
for(int i=1;i<=tot;i++)
if(!out[i])
ans=quan[i],flag++;
if(flag==1)
printf("%d\n",ans);
else printf("0");
return 0;
}

729

被折叠的 条评论
为什么被折叠?



