记录编号 608923 评测结果 AAAAAAAAAA
题目名称 4189.Minimum Cost Roads 最终得分 100
用户昵称 Gravatar会挽弯弓满月 是否通过 通过
代码语言 C++ 运行时间 0.686 s
提交时间 2025-10-30 16:24:49 内存使用 3.90 MiB
显示代码纯文本
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll N=2010,inf=1e18;
ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<48||c>57){
		if(c==45) f=-1;
		c=getchar();
	}
	while(c>=48&&c<=57){
		x=(x<<1)+(x<<3)+c-48;
		c=getchar();
	}
	return f*x;
}
ll n,m;
struct qu{
	ll u,v,l,c;
}que[N];
bool cmp(qu a,qu b){
	if(a.l==b.l) return a.c<b.c;
	return a.l<b.l;
}
struct node{
	ll to,nxt,len;
}e[N<<1];
ll h[N],tot;
void add(ll u,ll v,ll l){
	e[++tot]={v,h[u],l};
	h[u]=tot;
	return;
}
ll dis[N];
bool vis[N];
struct edge{
	ll len,id;
	friend bool operator <(const edge &a,const edge &b){
		return a.len>b.len;
	}
};
priority_queue<edge> q;
ll dijkstra(ll st,ll ed){
	while(q.size()) q.pop();
	for(ll i=0;i<=n;i++){
		dis[i]=inf;
		vis[i]=0;
	}
	dis[st]=0;
	q.push((edge){0,st});
	ll u,v,l;
	while(q.size()){
		u=q.top().id;q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(ll i=h[u];i;i=e[i].nxt){
			v=e[i].to;l=e[i].len;
			if(dis[v]>dis[u]+l){
				dis[v]=dis[u]+l;
				q.push((edge){dis[v],v});
			}
		}
	}
	return dis[ed];
}
ll ans;
int main(){
	freopen("Roads.in","r",stdin);
	freopen("Roads.out","w",stdout);
	n=read();m=read();
	for(ll i=1;i<=m;i++)
		que[i]={read(),read(),read(),read()};
	sort(que+1,que+m+1,cmp);
	ll u,v,l,c,k;
	for(ll i=1;i<=m;i++){
		u=que[i].u;v=que[i].v;
		l=que[i].l;c=que[i].c;
		k=dijkstra(u,v);
		if(k>l){
			ans+=c;
			add(u,v,l);
			add(v,u,l);
		}
	}
	printf("%lld",ans);
	return 0;
}