牛群里的牛相互崇拜,这种崇拜是单向可传递的,要求最受崇拜的牛有几个,最受崇拜的牛是受其余所有牛的崇拜
用tarjan算法
完全抄袭的模板,写出来了还是各种转不出来
#include<stdio.h>
#include<vector>
#include<stack>
#include<string.h>
using namespace std;
int n,m;
vector<int> vec[100005];
int vis[100005];
int dfn[100005],low[100005];
int gro_id[100000],gro[100005];
stack<int> sta;
int now,id;
void tarjan(int s)
{
vis[s]=2;
now++;
dfn[s]=low[s]=now;
sta.push(s);
for(int i=0; i<vec[s].size(); i++)
{
if(vis[vec[s][i]]==0)
{
tarjan(vec[s][i]);
low[s]=low[s]<low[vec[s][i]]?low[s]:low[vec[s][i]];
}
else if(vis[vec[s][i]]==2)
{
low[s]=low[s]<dfn[vec[s][i]]?low[s]:dfn[vec[s][i]];
}
}
if(dfn[s]==low[s])
{
id++;
while(1)
{
int t=sta.top();
gro_id[t]=id;
vis[t]=1;
sta.pop();
gro[id]++;
if(t==s)
break;
}
}
}
int main()
{
now=id=0;
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)
vec[i].clear();
for(int i=0; i<m; i++)
{
int a,b;
scanf("%d%d",&a,&b);
vec[a].push_back(b);
}
for(int i=1; i<=n; i++)
if(!vis[i])
tarjan(i);
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
for(int j=0; j<vec[i].size(); j++)
if(gro_id[i]!=gro_id[vec[i][j]])
{
vis[gro_id[i]]=1;
break;
}
vector<int> ans;
for(int i=1; i<=id; i++)
if(vis[i]==0)
ans.push_back(i);
//printf("%d\n",ans.size());
if(ans.size()!=1)
printf("0\n");
else
printf("%d",gro[ans[0]]);
return 0;
}