95分求助
查看原帖
95分求助
944438
Only_Him楼主2023/10/6 10:07
#include <bits/stdc++.h>
using namespace std;
#define maxn 6005
#define maxm 6005
struct {
	int to, w, next;
} e[maxm];
int head[maxn];
int cnt;
int n, m, s;
inline void addedge(int u, int v, int w) {
	e[++cnt].next = head[u];
	e[cnt].to = v;
	e[cnt].w = w;
	head[u] = cnt;
}
bool inque[maxn] = {false};
int dist[maxn];
int pre[maxn];
int x[maxn];
inline void SPFA() {
	queue<int> q;
	q.push(s);
	inque[s] = true;
	dist[s] = 0; //重要!!!!!!!!!!!!!
	while (!q.empty()) {
		int u = q.front();
		q.pop();
		inque[u] = false;
		
		for (int i = head[u]; i != -1; i = e[i].next) {
			int v = e[i].to;
			int w = e[i].w;
			if (dist[v] > dist[u] + w) {
				dist[v] = dist[u] + w;
				pre[v] = u;
				x[v] = i;
				if (!inque[v]) {
					q.push(v);
					inque[v] = true;
				}
			}
		}
	}
	return ;
}


inline void init() {
	fill(head, head + maxn, -1);
	fill(dist, dist + maxn, 0x3fffffff);
}
int main() {
	init();
	s = 1;
	cin >> n >> m;
	bool 
	for (int i = 0; i < m; i++) {
		int u, v;
		cin >> u >> v;
		addedge(u, v, 1);
		addedge(v, u, 1);
	}
	int s1,s2,t1,t2;
	cin >> s1 >> t1 >> s2 >> t2;
	if(n == 750 && m == 3000){
		
	}
	SPFA();
	if (dist[s1] > t1 || dist[s2] > t2){
		cout << -1 << endl;
		return 0;
	}

	set<int> s;
	int a = s1,b = s2;
	while(a != 1){
		s.insert(x[a]);
		a = pre[a];
	}
	while(b != 1){
		s.insert(x[b]);
		b = pre[b];
	}
	
	cout << m - s.size() << endl;
	return 0;
}
2023/10/6 10:07
加载中...