比赛 csp2025模拟练习3 评测结果 AAAAAAAAAA
题目名称 Minimum Cost Roads 最终得分 100
用户昵称 wdsjl 运行时间 0.523 s
代码语言 C++ 内存使用 4.01 MiB
提交时间 2025-10-30 10:47:19
显示代码纯文本
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int N = 2005;
const int inf = 1e9+5;

int n,m;
struct node {
    int u, v, l, p;
    bool operator<(node p2) {
        if(l != p2.l) return l < p2.l;
        return p < p2.p;
    }
} a[N];

vector<pair<int, int> > g[N];
int dis[N];
int vis[N];

priority_queue<pair<int, int> > pq;

int dij(int x, int y) {
    for(int i = 1; i <= n; i++) dis[i] = inf, vis[i] = 0;
    dis[x] = 0;
    pq.push((pair<int, int>){0, x});
    while(!pq.empty()) {
        int u = pq.top().second;
        pq.pop();
        if(vis[u]) continue;
        int v;
        for(int i = 0; i < g[u].size(); i++) {
            v = g[u][i].first;
            int w = g[u][i].second;
            if(dis[u] + w < dis[v]) {
                dis[v] = dis[u] + w;
                pq.push((pair<int, int>){-dis[v], v});
            }
        }
    }
    return dis[y];
}

int ans;

signed main() {
	freopen("Roads.in","r",stdin);
	freopen("Roads.out","w",stdout);
	scanf("%lld%lld",&n,&m);
    for(int i = 1; i <= m; i++) {
    	scanf("%lld%lld%lld%lld",&a[i].u,&a[i].v,&a[i].l,&a[i].p);
    }
    sort(a+1,a+m+1);
    int u, v, l, p;
    ans = 0;
    for(int i = 1; i <= m; i++) {
        u = a[i].u, v = a[i].v, l = a[i].l, p = a[i].p;
        if(dij(u, v) > l){
			ans+=p;
			g[u].push_back((pair<int, int>){v, l});
			g[v].push_back((pair<int, int>){u, l});
		}
    }
    cout<<ans<<endl;
    return 0;
}