这样做的问题是什么?
查看原帖
这样做的问题是什么?
482728
Engulf楼主2023/10/11 14:02

思路:不在最短路径树上的边均可删去

WA #20

#include <bits/stdc++.h>

using namespace std;

using ll = long long;
using pii = pair<int, int>;

#ifdef ONLINE_JUDGE
#define debug(...) 0
#else
#define debug(...) fprintf(stderr, __VA_ARGS__), fflush(stderr)
#endif

const int N = 3005, M = 3005;

int n, m;

struct edge {
    int to, nxt;
} e[M << 1];
int head[N], ecnt;
void add(int x, int y) {e[++ecnt] = {y, head[x]}, head[x] = ecnt;}

int dis[N];

int pre[N];

int s1, t1, s2, t2;

void spfa(int s) {
    queue<int> q;
    bitset<N> vis;
    memset(dis, 0x3f, sizeof dis);
    dis[s] = 0;
    vis[s] = 1;
    q.push(s);
    while (!q.empty()) {
        int u = q.front(); q.pop(); vis[u] = 0;
        for (int i = head[u]; i; i = e[i].nxt) {
            int v = e[i].to;
            if (dis[v] > dis[u] + 1) {
                dis[v] = dis[u] + 1;
                pre[v] = u;
                if (!vis[v])
                    q.push(v), vis[v] = 1;
            }
        }
    }
}

bool keep[N];

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m;
    for (int i = 1, x, y; i <= m; i++) {
        cin >> x >> y;
        add(x, y);
        add(y, x);
    }
    cin >> s1 >> t1 >> s2 >> t2;
    spfa(1);
    if (dis[s1] > t1 || dis[s2] > t2) {
        cout << -1 << "\n";
        exit(0);
    }
    while (s1 != 1) keep[s1] = 1, s1 = pre[s1];
    while (s2 != 1) keep[s2] = 1, s2 = pre[s2];
    cout << m - accumulate(keep + 1, keep + 1 + n, 0) << "\n";
    return 0;
}
2023/10/11 14:02
加载中...