| 比赛 |
csp2025模拟练习3 |
评测结果 |
AAAAAAAAAA |
| 题目名称 |
Minimum Cost Roads |
最终得分 |
100 |
| 用户昵称 |
徐诗畅 |
运行时间 |
0.635 s |
| 代码语言 |
C++ |
内存使用 |
4.01 MiB |
| 提交时间 |
2025-10-30 10:21:55 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2005;
int n,m,cnt,head[N];
struct edge{int v,w,next;}e[N<<1];
void addedge(int u,int v,int w){
e[++cnt].v=v;
e[cnt].w=w;
e[cnt].next=head[u];
head[u]=cnt;
}
struct node{
int u,d;
bool operator<(const node&r) const{
return d>r.d;
}
};
struct str{int u,v,w,c;}a[N];
bool cmp(str x,str y){
if(x.w==y.w) return x.c<y.c;
return x.w<y.w;
}
int vis[N],dis[N];
int d(int s,int t){
priority_queue<node> q;
memset(vis,0,sizeof(vis));
for(int i = 0;i<=n;i++) dis[i]=1e18;
q.push(node{s,0}); dis[s]=0;
while(!q.empty()){
int u = q.top().u; q.pop();
if(vis[u]) continue; vis[u]=1;
for(int i = head[u];i;i=e[i].next){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
q.push(node{v,dis[v]});
}
}
}
return dis[t];
}
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].w,&a[i].c);
sort(a+1,a+1+m,cmp); int ans=0;
for(int i = 1;i<=m;i++){
if(d(a[i].u,a[i].v)>a[i].w){
ans+=a[i].c;
addedge(a[i].u,a[i].v,a[i].w);
addedge(a[i].v,a[i].u,a[i].w);
}
}
printf("%lld",ans);
return 0;
}