| 比赛 |
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;
}