有人能帮我看看我的构式代码吗?
查看原帖
有人能帮我看看我的构式代码吗?
987758
CaoSheng_zzz楼主2024/7/30 13:53
#include <algorithm>
#include <iostream>
#include <string.h>
#include <stdio.h>
#include <math.h>
#include <queue>
#include <map>
#define prt printf
#define ll long long
#define int long long
#define spc prt(" ")
#define ent prt("\n")
using namespace std;

int read(){
	int f = 1 , k = 0;
	char c = getchar();
	while(c < '0' || c > '9'){
		if(c == '-') f = -1;
		c = getchar() ;
	}
	while(c >= '0' && c <= '9'){
		k = (k << 3) + (k << 1) + (c ^ 48);
		c = getchar() ;
	}
	return (f == 1 ? k : -k);
}

void output(int now){
	if(now > 9) output(now / 10);
	putchar((now % 10) ^ 48);
}

int mn(int a , int b) { return a < b ? a : b ;}

const int maxn = 1e5 + 1 , mod = 1e9 + 7;
map<int , map<int , int > > G; 
int n , m , ans = 0 , g , g2; 
int cnt = 0 , h[maxn];
int vis[maxn] , d[maxn] , in[maxn] , team[maxn] , vist[maxn] , cl = 0;
struct edge{
	int next , to;
}e[maxn << 1];

void add(int u , int v){
	e[++ cnt].next = h[u];
	e[cnt].to = v;
	h[u] = cnt;
}

int dfs(int u , int fa){
	if(vis[u] != 0) return 0;
	vis[u] = 1 ; int dv = 0 ; ++ g2;
	if(in[u] == false) ++ g;
	else if(vist[team[u]] == false){
		vist[team[u]] = 1;
		++ g;
	}
	for(int i=h[u] ; i ; i=e[i].next){
		int v = e[i].to ;
		if(v == fa) continue ;
		dv += dfs(v , u) ;
		dv += 1;
	}
	return dv;
}

void df(int u , int fa , int num){
	vist[u] = true ; team[u] = num;
	for(int i=h[u] ; i ; i=e[i].next){
		int v = e[i].to;
		if(vist[v] == true || in[v] == false || v == fa) continue ;
		df(v , u , num);
	}
}

void top(){
	queue<int> q ;
	for(int i=1 ; i<=n ; i++) if(d[i] <= 1) q.push(i) , in[i] = false ;
	while(! q.empty()){
		int u = q.front() ; q.pop() ;
		for(int i=h[u] ; i ; i=e[i].next){
			int v = e[i].to;
			-- d[v];
			if(d[v] == 1) q.push(v) , in[i] = false;
		}
	}
}

signed main(){
	n = read() , m = read() ;
	for(int i=1 ; i<=m ; i++){
		int u = read() , v = read() ;
		if(G[u][v] == 1) continue;
		G[u][v] = G[v][u] = 1;
		add(u , v) ; add(v , u);
		++ d[u] , ++ d[v];
	}
	for(int i=1 ; i<=n ; i++) in[i] = true;
	top();
	for(int i=1 ; i<=n ; i++){
		if(in[i] == false || vist[i] == true)  continue;
		df(i , i , ++ cl);
	}
	memset(vist , 0 , sizeof vist) ;
	for(int i=1 ; i<=n ; i++){
		if(! vis[i]){
			g = g2 = 0 ; int f = dfs(i , i);
			if(f > g2){
				putchar('0');
				return 0;
			}
			else if(f == g) ans *= 1;
			else ans = (ans > 0 ? ans : 1) * g ;
			ans %= mod;
		}
	}
	output(ans);
	return 0;
}
2024/7/30 13:53
加载中...