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