入门最短路求调
查看原帖
入门最短路求调
456419
Commandant楼主2022/3/6 08:50

样例都过不去,和大部分题解的思路基本上都是一样的

#include <climits>
#include <cstring>
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

#define int long long

const int maxn = 510;
struct node {
    int v, w, flow;
    node(int vv, int ww, int fflow) {
        v = vv;
        w = ww;
        flow = fflow;
    }
};
vector<node> g[maxn];
int c[maxn];
int n, m, x;

queue<int> q;
bool inqueue[maxn];
int d[maxn];
void spfa(int maxflow) {
    memset(inqueue, 0, sizeof(inqueue));
    memset(d, 0x3f, sizeof(d));
    d[1] = 0;
    q.push(1);
    inqueue[1] = true;
    while (!q.empty()) {
        int u = q.front();
        q.pop();
        inqueue[u] = false;
        for (int i = 0; i < g[u].size(); i++) {
            int v = g[u][i].v;
            if (g[u][i].flow <= maxflow && d[v] > d[u] + g[u][i].w) {
                d[v] = d[u] + g[u][i].w;
                if (!inqueue[v]) {
                    q.push(v);
                    inqueue[v] = true;
                }
            }
        }
    }
}

signed main() {
    cin >> n >> m >> x;
    for (int i = 1; i <= m; i++) {
        int u, v, w, flow;
        cin >> u >> v >> w >> flow;
        g[u].push_back(node(v, w, flow));
        g[v].push_back(node(u, w, flow));
        c[i] = flow;
    }
    int ans = LLONG_MAX;
    for (int i = 1; i <= n; i++) {
        spfa(c[i]);
        ans = min(ans, d[n] + x / c[i]);
    }
    cout << ans << endl;
    return 0;
}
2022/3/6 08:50
加载中...