20分记忆化dfs求调
查看原帖
20分记忆化dfs求调
718169
__int127楼主2024/1/9 12:23
#include <bits/stdc++.h>
using namespace std;
int n, m, fr, to, a1[5005], b1[5005], a[5005], b[5005];
int vis[5005];
int j_1, j2;
vector <int> vt[5005];
void dfs(int x, int y, int z){
	if (vis[x]){
		return;
	}
	int len = vt[x].size();
	for (int i = 0; i < len; i++){
		bool flag = 0;
		for (int j = 0; j < j2; j++){
			if (vt[x][i] == b[j]){
				vis[x]++;
				flag = 1;
				break;
			}
		}
		if (!flag){
			if (!z){
				dfs(vt[x][i], y, 1);
			} else {
				dfs(vt[x][i], x, 1);
			}
		}
		vis[x] += vis[vt[x][i]];
	}
}
int main(){
	ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
	cin >> n >> m;
	while (m--){
		cin >> fr >> to;
		a1[to] = b1[fr] = 1;
		vt[fr].push_back(to);
	}
	for (int i = 1; i <= n; i++){
		if (a1[i] == 0){
			a[j_1++] = i;
		}
		if (b1[i] == 0){
			b[j2++] = i;
		}
	}
	for (int i = 0; i < j_1; i++){
		dfs(a[i], a[i], 0);
	}
	int sum = 0;
	for (int i = 0; i < j_1; i++){
		sum += vis[a[i]];
	}
	cout << sum % 80112002;
	return 0;
}
2024/1/9 12:23
加载中...