P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G
P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G
题目背景
本题测试数据已修复。
题目描述
每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 AAA 喜欢 BBB,BBB 喜欢 CCC,那么 AAA 也喜欢 CCC。牛栏里共有 NNN 头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。
输入格式
第一行:两个用空格分开的整数:NNN 和 MMM。
接下来 MMM 行:每行两个用空格分开的整数:AAA 和 BBB,表示 AAA 喜欢 BBB。
输出格式
一行单独一个整数,表示明星奶牛的数量。
输入输出样例 #1
输入 #1
3 3
1 2
2 1
2 3
输出 #1
1
说明/提示
只有 333 号奶牛可以做明星。
【数据范围】
对于 10%10\%10% 的数据,N≤20N\le20N≤20,M≤50M\le50M≤50。
对于 30%30\%30% 的数据,N≤103N\le10^3N≤103,M≤2×104M\le2\times 10^4M≤2×104。
对于 70%70\%70% 的数据,N≤5×103N\le5\times 10^3N≤5×103,M≤5×104M\le5\times 10^4M≤5×104。
对于 100%100\%100% 的数据,1≤N≤1041\le N\le10^41≤N≤104,1≤M≤5×1041\le M\le5\times 10^41≤M≤5×104。
思路
参照了luogu上的题解。
代码见下
```#include<bits/stdc++.h>
using namespace std;
long long a,b;
long long n,m,aa,bb,dfn[200005],low[200005],st[200005],n2=0,ss=0,s2[200005],df[200005],fd[200005],db=0,bd=0;
vector<long long> v[200005];
inline void abc(long long a1){
low[a1]=dfn[a1]=++n2;
st[++st[200004]]=a1;
for(int i=0;i<v[a1].size();i++){
long long tt=v[a1][i];
if(dfn[tt]!=0){
low[a1]=min(low[a1],dfn[tt]);
}
else{
abc(tt);
low[a1]=min(low[a1],low[tt]);
}
}
if(low[a1]==dfn[a1]){
ss++;
s2[a1]=ss;
df[ss]=1;
while(st[st[200004]]!=a1){
s2[st[st[200004]]]=ss;
st[200004]--;
df[ss]++;
}
st[200004]--;
}
return ;
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>aa>>bb;
v[aa].push_back(bb);
//v[bb].push_back(aa);
}
for(int i=1;i<=n;i++){
if(dfn[i]==0){
abc(i);
}
}
for(int i=1;i<=n;i++){
for(int j=0;j<v[i].size();j++){
if(s2[i]!=s2[v[i][j]]){
fd[s2[i]]++;
}
}
}
for(int i=1;i<=ss;i++){
if(!fd[i]){
db=df[i];
bd++;
}
}
if(bd==1){
cout<<db<<endl;
}
else{
cout<<0<<endl;
}
return 0;
}

浙公网安备 33010602011771号