1 条题解

  • 0
    @ 2025-9-10 9:13:07

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    
    const int N=2*1005;
    const int M=2*1e5+100;
    int ans,n;
    int to[M],h[N],w[M],nxt[M],tot,dis[N],vis[N]; 
    void add(int a, int b, int c){
    	to[++tot]=b,w[tot]=c,nxt[tot]=h[a],h[a]=tot;
    } 
     
    void Dijkstra(int s){
    	priority_queue<pair<int,int> > q;
    	memset(dis,0x3f,sizeof(dis));
    	dis[s]=0;
    	q.push({0,s});
    	while(!q.empty()){
    	     pair<int,int> k=q.top();
    	     q.pop();
    	     int v=k.second;
    	     if(vis[v]) continue;
    	     vis[v]=1;
    	     for(int i=h[v]; i!=0; i=nxt[i]){
    	     	 int u=to[i];
    	     	 if(dis[v]+w[i]<dis[u]){
    	     	 	dis[u]=dis[v]+w[i];
    	     	 	q.push({-dis[u],u});
    			 }
    		 }
    	}
    }
    int main()
    {
    	int c,u,v,w,m;
    	cin>>n>>m;
    	for(int i=1; i<=m; i++){
    		cin>>u>>v>>w;
    		add(u,v,w);
    		add(v+n,u+n,w);//反向建边 
    	}
    	Dijkstra(1);
    	for(int i=2; i<=n; i++){
    		ans+=dis[i];
    	}
    	Dijkstra(1+n);
    	for(int i=n+2; i<=2*n; i++){
    		ans+=dis[i];
    	}
    	cout<<ans<<endl;
    	return 0;
    }
    
    

    Pascal :

    var max,n,m,i,j,k,l,u,v,w:longint;
    a,b:array[1..1000,1..1000]of longint;
    c:array[1..1000]of boolean;
    begin
    readln(n,m);
    for i:=1 to m do
    begin
    readln(u,v,w);
    if (a[u,v]=0)or(a[u,v]>w) then begin
    a[u,v]:=w;
    b[v,u]:=w;
    end;
    end;
    c[1]:=true;
    for i:=2 to n do
    begin
    max:=maxlongint;
    for j:=2 to n do
    if (not c[j])and(a[1,j]<max)and(a[1,j]<>0) then begin
    max:=a[1,j];
    k:=j;
    end;
    c[k]:=true;
    for j:=2 to n do
    if a[k,j]<>0 then if (a[1,k]+a[k,j]<a[1,j])or(a[1,j]=0) then
    a[1,j]:=a[1,k]+a[k,j];
    end;
    for i:=2 to n do
    inc(l,a[1,i]);
    a:=b;
    c[1]:=false;
    for i:=2 to n do
    begin
    max:=maxlongint;
    for j:=2 to n do
    if (c[j])and(a[1,j]<max)and(a[1,j]<>0) then begin
    max:=a[1,j];
    k:=j;
    end;
    c[k]:=false;
    for j:=2 to n do
    if a[k,j]<>0 then if (a[1,k]+a[k,j]<a[1,j])or(a[1,j]=0) then
    a[1,j]:=a[1,k]+a[k,j];
    end;
    for i:=2 to n do
    inc(l,a[1,i]);
    writeln(l);
    end.
    
    
    • 1

    信息

    ID
    4214
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者