help P2341
  • 板块学术版
  • 楼主vectorxyz
  • 当前回复12
  • 已保存回复12
  • 发布时间2024/7/3 19:50
  • 上次更新2024/7/3 20:19:56
查看原帖
help P2341
1114241
vectorxyz楼主2024/7/3 19:50
/*
    Author: Rainypaster(lhy)
    Time: 07/03/2024
    File: [Rainypaster]
    Email: 2795974905@qq.com
*/
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <bits/stdc++.h>
#define int long long
using namespace std;

namespace IO
{
    template<typename T>
    T read(T x)
    {
        T sum = 0, opt = 1;
        char ch = getchar();
        while(!isdigit(ch)) opt = (ch == '-') ? -1 : 1, ch = getchar();
        while( isdigit(ch)) sum = (sum << 1) + (sum << 3) + (ch ^ 48), ch = getchar();
        return sum * opt;
    }

}

#define read IO::read(0)
#define rep(i, n) for(int i = 1; i <= n; i ++)
#define repa(i, n) for(int i = 0; i < n; i ++)
#define repb(i, n) for(int i = 1; i <= n; i ++)
#define repc(i, n) for(int i = 0; i < n; i ++)
#define lson (u << 1)
#define rson (u << 1 | 1)

#define gcd(a, b) __gcd(a, b)
const int N = 1e6 + 5, MOD = 1e8;
 
int ans;
int a[N]], dfn[N], low[N];
bool vis[N], num[N], f[N], out[N];
vector<int> g[N];
stack<int> st;
int t, cnt;
void tarjan(int u)
{
    dfn[u] = low[u] = ++t;
    vis[u] = 1;
    st.push(u);
    for(int i = 0;i < g[u].size();i ++ ){
        int v = g[u][i];
        if(!dfn[v]){
            tarjan(v);
            low[u] = min(low[u], low[v]);
        }
        else if(vis[v]) low[u] = min(low[u], dfn[v]);
    }
    if(low[u] == dfn[u]){
        cnt ++ ;
        int k;
        do
        {
           k = st.top();
           vis[k] = 0;
           num[cnt] ++ ;
           f[k] = cnt;
           st.pop(); 
        } while (k != u);
        
    }
}

void solve()
{
    int n = read, m = read;

    for(int i = 1;i <= m;i ++ ){
        int a = read, b = read;
        g[a].push_back(b);
    }    
    for(int i = 1;i <= n;i ++ ){
        if(!dfn[i]) tarjan(i);
    }
    for(int u = 1;u <= n;u ++ ){
        for(int i = 0;i < g[u].size();i ++ ){
            int v = g[u][i];
            if(f[u] != f[v]) out[f[u]] ++ ;
        }
    }
    int ans = -1;
    for(int i = 1;i <= n;i ++ ){
        if(out[i] == 0 && ans == -1) {
            ans = i;
        }
        else if(out[f[i]] == 0 && ans != -1){
            cout << 0;
            return ;
        }
    }
    cout << num[ans] << endl;
}

signed main()
{
    int T = 1;
    while(T -- ) solve();
    return 0;
}
2024/7/3 19:50
加载中...