对于从 1 号点走到 s1 和 s2 号点,问最多可以删除多少个边,其实就是最短路变形,如果你不判其中有重边的话竟然有 55 分。(树的点对了和后四个 点还有一点分)
#include<bits/stdc++.h>
using namespace std;
const int N = 3e3 + 5;
struct node{
int x, cnt;
}stk[N];
vector<int> g[N];
int n, m, s1, t1, s2, t2, head, tail, vis[N];
void Record(int x, int cnt){
if(vis[x]){
return ;
}
vis[x] = 1;
stk[++tail] = {x, cnt};
}
int BFS(int x, int c, int sx, int sy){
fill(&vis[1], &vis[n] + 1, 0);
head = 1, tail = 0;
Record(x, c);
while(head <= tail){
node q = stk[head++];
if(q.x == sx){
return (q.cnt <= sy ? q.cnt : -1);
}
for(int i = 0; i < g[q.x].size(); i++){
Record(g[q.x][i], q.cnt + 1);
}
}
return -1;
}
int main(){
cin >> n >> m;
for(int i = 1, u, v; i <= m; i++){
cin >> u >> v;
g[v].push_back(u);
g[u].push_back(v);
}
cin >> s1 >> t1 >> s2 >> t2;
int a = BFS(1, 0, s1, t1), b = BFS(1, 0, s2, t2);
cout << (a == -1 || b == -1 ? -1 : (m * 2 - a - b - 1) / 2);
return 0;
}
@ 管理员加强数据。