76pts WA on #16 ~ #21 玄关求调
查看原帖
76pts WA on #16 ~ #21 玄关求调
1030286
lgzbgz楼主2025/1/16 16:31

rt

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int inf = 0x3f3f3f3f;
const int mxn =  5e4 + 10;

#define read(x) {\
                int abc = 0, cba = 1;\
                char bca = getchar();\
                while(bca > '9' ||bca < '0') {\
                    if(bca == '-') cba = -1;\
                    bca = getchar();\
                }\
                while('0' <= bca && bca <= '9') {\
                    abc = (abc << 1) + (abc << 3) + (bca ^ 48);\
                    bca = getchar();\
                }\
                x = cba*abc;\
            }
inline void write(int x);

int n, m;
struct merry {
	int nxt, to;
} umy[mxn];
int head[mxn], cnt;
int sta[mxn], insta[mxn], top;
int dfn[mxn], low[mxn], inde;
int belong[mxn];
int out[mxn], tot[mxn];
int num;

inline void add(int nxt, int to){
	umy[++cnt].nxt = head[nxt];
	head[nxt] = cnt;
	umy[cnt].to = to;
}

inline void tarjan(int u){
	int to;
	dfn[u] = low[u] = ++inde;
	sta[++top] = u;
	insta[u] = 1;
	for(int i = head[u]; i; i = umy[i].nxt){
		to = umy[i].to;
		if(!dfn[to]){
			tarjan(to);
			low[u] = min(low[u], low[to]);
		}
		else if(insta[to]){
			low[u] = min(dfn[u], low[to]);
		}
	}
	if(dfn[u] == low[u]){
		num++;
		do{
			to = sta[top--];
			belong[to] = num;
			insta[to] = 0;
			tot[num]++;
		}while (u != to);
	}
}

signed main() {
//    freopen("1.in", "r", stdin);
//    freopen("1.in", "w", stdout);

    read(n); read(m);
    for(int i = 1; i <= m; i++){
    	int a, b;
    	read(a); read(b);
    	add(a, b);
	}
	for(int i = 1; i <= n; i++){
		if(!dfn[i]){
			tarjan(i);
		}
	}
	for(int u = 1; u <= n; u++){
		for(int i = head[u]; i; i = umy[i].nxt){
			int to = umy[i].to;
			if(belong[u] != belong[to]){
				out[belong[u]]++;
			}
		}
	}
	
	int ccc = 0;
	for(int i = 1; i <= num; i++){
		if(!out[i]){
			if(ccc){
				puts("0");
				return 0;
			}
			ccc = i;
		}
	}
	
	write(tot[ccc]);

    return 0;
}

inline void write(int x) {
    if(x < 0) putchar('-'), x = -x;
    if(x < 10) putchar(x + '0');
    else write(x / 10), putchar((x % 10) + '0');
}


2025/1/16 16:31
加载中...