95分玄学WA一个点
查看原帖
95分玄学WA一个点
271096
Semorius楼主2021/10/19 18:00
#include <bits/stdc++.h>
using namespace std;
const int SIZE = 500005;
int n, m, tot;
int head[SIZE], nxt[SIZE*2], ver[SIZE*2];
int s1, t1, s2, t2;
int d1[SIZE], d2[SIZE], las[SIZE], b[SIZE], vis[SIZE];
priority_queue<pair<int, int>> q;
int ans;

inline int rd(){
	int x = 0, f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9'){
		if(ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9'){
		x = (x<<1) + (x<<3) + (ch^48);
		ch = getchar();
	}
	return x*f;
}

void add(int x, int y){
	ver[++tot] = y;
	nxt[tot] = head[x];
	head[x] = tot;
}

void dij1(){
	memset(vis, 0, sizeof(vis));
	for(int i = 1; i <= n; i++) d1[i] = 1<<28;
	d1[1] = 0; 
	q.push(make_pair(0, 1));
	while(q.size()){
		int x = q.top().second; q.pop();
		if(vis[x]) continue;
		vis[x] = 1;
		for(int i = head[x]; i; i = nxt[i]){
			int y = ver[i];
			if(d1[y] > d1[x] + 1){
				d1[y] = d1[x] + 1;
				q.push(make_pair(-d1[y], y));
				las[y] = x;
			}
		}
	}
}

void dij2(int st){
	memset(vis, 0, sizeof(vis));
	for(int i = 1; i <= n; i++) d2[i] = 1<<28;
	d2[st] = 0; 
	q.push(make_pair(0, st));
	while(q.size()){
		int x = q.top().second; q.pop();
		if(vis[x]) continue;
		vis[x] = 1;
		for(int i = head[x]; i; i = nxt[i]){
			int y = ver[i];
			if(d2[y] > d2[x] + 1){
				d2[y] = d2[x] + 1;
				q.push(make_pair(-d2[y], y));
			}
		}
	}
}

int main() {
	n = rd(), m = rd();
	for(int i = 1; i <= m; i++){
		int x = rd(), y = rd();
		add(x, y); add(y, x);
	}
	s1 = rd(), t1 = rd(), s2 = rd(), t2 = rd();
	dij1();
	if(d1[s1] > t1 || d1[s2] > t2){
		printf("-1");
		return 0;
	}
//	for(int i = 1; i <= n; i++) printf("%d ", d1[i]);
	int now = s1;
	while(now != 1){
		b[now] = 1;
		now = las[now];
	}
	b[1] = 1;
	dij2(s2);
	ans = -1;
	for(int i = 1; i <= n; i++){
		if(b[i]){
			if(d1[i] + d2[i] <= t2) ans = max(ans, m-d1[s1]-d2[i]);
		}
	}
	memset(b, 0, sizeof(b));
	now = s2;
	while(now != 1){
		b[now] = 1;
		now = las[now];
	}
	b[1] = 1;
	dij2(s1);
	for(int i = 1; i <= n; i++){
		if(b[i]){
			if(d1[i] + d2[i] <= t1) ans = max(ans, m-d1[s2]-d2[i]);
		}
	}
	printf("%d", ans);
	return 0;
}


2021/10/19 18:00
加载中...