为什么有一个点T了?
查看原帖
为什么有一个点T了?
459188
zrt090604楼主2022/12/24 18:03

请大佬们指出本蒟蒻的错误或者提供更优的算法!

#include<bits/stdc++.h>
using namespace std;
const int N = 5e3 + 5;
int n, k, p, r, cnt, in[N], a[N][N], f[N], b[N], h[N], c;
bool vis[N], t[N];
int main () {
	scanf("%d%d%d", &n, &k, &p);
	for(int i = 1;i <= p;++i) scanf("%d", f+i), vis[f[i]] = true;
	scanf("%d", &r);
	for(int i = 1;i <= r;++i) {
		scanf("%d%d", b+i, in+i);
		vis[b[i]] = true;
		for(int j = 1;j <= in[i];++j) scanf("%d", &a[i][j]);
	}
	if(vis[k] == false) puts("-1"), exit(0);
	fill(vis+1, vis+n+1, false);
	for(int i = 1;i <= p;++i) vis[f[i]] = true;
	while(vis[k] == false) {
		++cnt;
		c = 0;
		bool flag = false;
		for(int i = 1;i <= r;++i) {
			if(t[i]) continue;
			flag = true;
			for(int j = 1;j <= in[i];++j)
				if(!vis[a[i][j]]) {flag = false; break;}
			if(flag) h[++c] = b[i], t[i] = true;
		}
		for(int i = 1;i <= c;++i) vis[h[i]] = true;
		if(!c) puts("-1"), exit(0);
	}
	printf("%d\n", cnt);
	return 0;
}
2022/12/24 18:03
加载中...