样例过,第四个点对
查看原帖
样例过,第四个点对
799098
chengzihan620楼主2024/2/28 16:14
#include<bits/stdc++.h> 
using namespace std; 
#define int long long
inline int read(){int x=0,f=1;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();}return x*f;}
struct graph{
	int k;
	int v;
	int w;
}edge1[2000001],edge2[2000001];
int head1[1000001],head2[1000001],vis[1000001],num,f[1000001],ans,n,m;
typedef pair<int,int> P;
void add1(int from,int to,int dis){
	edge1[++num].k=head1[from];
	edge1[num].v=to;
	edge1[num].w=dis;
	head1[from]=num;
}
void add2(int from,int to,int dis){
	edge2[num].k=head2[from];
	edge2[num].v=to;
	edge2[num].w=dis;
	head2[from]=num;
}
int dijkstra(graph g[],int h[]){//封装
	int sum=0;
	priority_queue<P>q;
	memset(f,0x7f,sizeof f);
	memset(vis,0,sizeof vis);
	f[1]=0;
	q.push(P(0,1));
	while(!q.empty()){
		P t=q.top();q.pop();
		int j=t.second;
		if(vis[j])continue;
		vis[j]=1;
		for(int i=h[j];i;i=g[i].k){
			int l=g[i].v;
			if(f[l]>f[j]+g[i].w){
				f[l]=f[j]+g[i].w;
				q.push(P(f[l],l));
			}
		}
	}
	for(int i=1;i<=n;i++)
		sum+=f[i];
	return sum;
}
signed main(){
	n=read();m=read();
	while(m--){
		int a=read(),b=read(),c=read();
		add1(a,b,c);add2(b,a,c);
	}
	ans=dijkstra(edge1,head1)+dijkstra(edge2,head2);
	cout<<ans;
	return 0;
}
2024/2/28 16:14
加载中...