0 分求助
查看原帖
0 分求助
448887
cancan123456楼主2023/1/8 22:29
#include <cstdio>
using namespace std;
int link[50][50][2];
bool out[50][50], vis[50][50];
bool check(int x, int y, int u, int v) {
	if (out[x][u] && !out[y][v]) {
		return false;
	}
	if (vis[u][v]) {
		return true;
	}
	vis[u][v] = true;
	if (!check(x, y, link[x][u][0], link[y][v][0])) {
		return false;
	}
	if (!check(x, y, link[x][u][1], link[y][v][1])) {
		return false;
	}
	return true;
}
int dis[50][50];
int max(int a, int b) {
	return a > b ? a : b;
}
int main() {
	int S;
	scanf("%d", &S);
	for (int n, m, i = 0; i < S; i++) {
		scanf("%d %d", &n, &m);
		for (int j = 0, x; j < m; j++) {
			scanf("%d", &x);
			out[i][x] = true;
		}
		for (int j = 0; j < n; j++) {
			scanf("%d %d", &link[i][j][0], &link[i][j][1]);
		}
	}
	for (int i = 0; i < S; i++) {
		for (int j = 0; j < S; j++) {
			dis[i][j] = -114514;
			if (i != j) {
				for (int k = 0; k < 50; k++) {
					for (int l = 0; l < 50; l++) {
						vis[k][l] = false;
					}
				}
				if (check(i, j, 0, 0)) {
					dis[i][j] = 1;
				}
			}
		}
	}
	int ans = 0;
	for (int k = 0; k < S; k++) {
		for (int i = 0; i < S; i++) {
			for (int j = 0; j < S; j++) {
				dis[i][j] = max(dis[i][j], dis[i][k] + dis[k][j]);
			}
		}
	}
	for (int i = 0; i < S; i++) {
		for (int j = 0; j < S; j++) {
			ans = max(ans, dis[i][j]);
		}
	}
	printf("%d", ans + 1);
	return 0;
}
2023/1/8 22:29
加载中...