P5683求调
  • 板块学术版
  • 楼主Sukilin
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/28 15:42
  • 上次更新2024/11/28 18:24:48
查看原帖
P5683求调
959201
Sukilin楼主2024/11/28 15:42
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
const int N = 3e3 + 7;
const int M = 3e3 + 7;
const int inf = 0x7fffffff;
int head[N], nex[M], to[M];
int cnt;
void add(int u, int v) {
	cnt++;
	nex[cnt] = head[u];
	to[cnt] = v;
	head[u] = cnt;
}
std::queue <int> q;
int dis[3][N];
void bfs(int rt, int tp) {
	dis[tp][rt] = 0;
	while(!q.empty()) q.pop();
	q.push(rt);
	while(!q.empty()) {
		int u = q.front();
		q.pop();
		for(int i = head[u]; i; i = nex[i]) {
			int v = to[i];
			if(dis[tp][v] > dis[tp][u] + 1) 
				dis[tp][v] = dis[tp][u] + 1, q.push(v);
		}
	}
	return;
}
int main() {
	std::freopen("test.in", "r", stdin);
	int n, m;
	std::cin >> n >> m;
	for(int i = 1; i <= m; i++) {
		int x, y;
		std::cin >> x >> y;
		add(x, y);
		add(y, x);
	}
	int s1, t1, s2, t2;
	std::cin >> s1 >> t1 >> s2 >> t2;
	std::cout << nex[2736];
		//for(int i = head[1]; i; i = nex[i]) std::cout << i << ' ';
	std::memset(dis, 0x3f, sizeof dis);
	bfs(1, 0);
	bfs(s1, 1);
	bfs(s2, 2);
	int ans = inf;
	for(int i = 1; i <= n; i++) {
		//if(i == 1 || i == s1 || i == s2) continue;
		int l1 = dis[0][i], l2 = dis[1][i], l3 = dis[2][i];
		if(l1 + l2 <= t1 && l1 + l3 <= t2 && l1 + l2 + l3 <= ans) ans = l1 + l2 + l3;
	}
	std::cout << (ans == inf ? -1 : m - ans) << '\n';
	return 0;
}

最后几个测试点遍历与1相邻的点时死循环了

2024/11/28 15:42
加载中...