P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G

P2341 [USACO03FALL / HAOI2006] 受欢迎的牛 G

题目背景

本题测试数据已修复。

题目描述

每头奶牛都梦想成为牛棚里的明星。被所有奶牛喜欢的奶牛就是一头明星奶牛。所有奶牛都是自恋狂,每头奶牛总是喜欢自己的。奶牛之间的“喜欢”是可以传递的——如果 AAA 喜欢 BBBBBB 喜欢 CCC,那么 AAA 也喜欢 CCC。牛栏里共有 NNN 头奶牛,给定一些奶牛之间的爱慕关系,请你算出有多少头奶牛可以当明星。

输入格式

第一行:两个用空格分开的整数:NNNMMM

接下来 MMM 行:每行两个用空格分开的整数:AAABBB,表示 AAA 喜欢 BBB

输出格式

一行单独一个整数,表示明星奶牛的数量。

输入输出样例 #1

输入 #1

3 3
1 2
2 1
2 3

输出 #1

1

说明/提示

只有 333 号奶牛可以做明星。

【数据范围】

对于 10%10\%10% 的数据,N≤20N\le20N20M≤50M\le50M50

对于 30%30\%30% 的数据,N≤103N\le10^3N103M≤2×104M\le2\times 10^4M2×104

对于 70%70\%70% 的数据,N≤5×103N\le5\times 10^3N5×103M≤5×104M\le5\times 10^4M5×104

对于 100%100\%100% 的数据,1≤N≤1041\le N\le10^41N1041≤M≤5×1041\le M\le5\times 10^41M5×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;
}
posted @ 2025-10-28 19:13  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源