比赛 csp2025模拟练习3 评测结果 AAAAAAAAAA
题目名称 Minimum Cost Roads 最终得分 100
用户昵称 梧叶已同秋雨去 运行时间 0.781 s
代码语言 C++ 内存使用 9.52 MiB
提交时间 2025-10-30 11:09:32
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
int n,cnt,m;
struct node{
	int u,v,l,c;
}t[2005];
long long dis[2005][2005],ans;
bool cmp(node a,node b){
	if(a.l!=b.l)return a.l<b.l;
	return a.c<b.c;
}
long long ha[2005],nxt[4005],to[4005],w[4005],cn;
void add(int x,int y,int v){
	cn++;
	nxt[cn]=ha[x];
	ha[x]=cn;
	to[cn]=y;
	w[cn]=v;
}
priority_queue<pair<long long,long long>,vector<pair<long long,long long> >,greater<pair<long long,long long> > >q;
int vis[2005];
long long di(int s,int e){
	for(int i=1;i<=n;i++){
		vis[i]=0;
		dis[s][i]=1e16;
	}
	dis[s][s]=0;
	q.push({0,s});
	while(!q.empty()){
		int u=q.top().second;
		q.pop();
		if(vis[u]==1)continue;
		vis[u]=1;
		for(int i=ha[u];i!=0;i=nxt[i]){
			int v=to[i];
			if(dis[s][v]>dis[s][u]+w[i]){
				dis[s][v]=dis[s][u]+w[i];
				q.push({dis[s][v],v});
			}
		}
	}
	return dis[s][e];
}
int main(){
	freopen("Roads.in","r",stdin);
	freopen("Roads.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>t[i].u>>t[i].v>>t[i].l>>t[i].c;
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			dis[i][j]=1e16;
		}
	}
	sort(t+1,t+m+1,cmp);
	for(int i=1;i<=m;i++){
		if(t[i].l<di(t[i].u,t[i].v)){
//			cout<<t[i].u<<" "<<t[i].v<<" "<<t[i].l<<" "<<di(t[i].u,t[i].v)<<endl; 
			dis[t[i].u][t[i].v]=t[i].l;
			dis[t[i].v][t[i].u]=t[i].l;
			add(t[i].u,t[i].v,t[i].l);
			add(t[i].v,t[i].u,t[i].l);
			ans+=t[i].c; 
		}
	}
//	for(int i=1;i<=n;i++){
//		for(int j=1;j<=n;j++){
//			cout<<dis[i][j]<<" ";
//		}cout<<endl;
//	}
	cout<<ans;
	return 0;
}