原文链接:https://www.luogu.com.cn/problem/P1629
Ac代码:
#include<iostream>
#include<string.h>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
int n,m;
int inf=1e8;
int lowc[2][1005],visit[1005];
long long sum=0;
typedef struct node{
int id;int w;
bool operator <(const node &a)const{
return a.w<w;
}
}node;
node nod,nodd;
priority_queue<node> que;
int head[2][1005],cnt[2]={0};
typedef struct edged{
int fr,to,next,w;
}edged;
edged edge[2][100005];
void add(int status,int u,int v,int w){
edge[status][cnt[status]].fr=u;
edge[status][cnt[status]].to=v;
edge[status][cnt[status]].next=head[status][u];
edge[status][cnt[status]].w=w;/**/
head[status][u]=cnt[status];
cnt[status]++;
}
void dijkstra(int status,int now){
int i,j;
for(i=0;i<1005;i++){
lowc[status][i]=inf;visit[i]=0;
}
lowc[status][now]=0;
nod.id=now;nod.w=0;
que.push(nod);
while(!que.empty()){
nod=que.top();que.pop();
if(visit[nod.id]==1) continue;
visit[nod.id]=1;
for(i=head[status][nod.id];i!=-1;i=edge[status][i].next){
int e=edge[status][i].to;
if(lowc[status][e]>lowc[status][nod.id]+edge[status][i].w){
lowc[status][e]=lowc[status][nod.id]+edge[status][i].w;
if(visit[e]==0){
nodd.id=e;nodd.w=lowc[status][e];
que.push(nodd);
}
}
}
}
}
int main(){
int i,j;
cin>>n>>m;
memset(head,-1,sizeof(head));
for(i=0;i<m;i++){
int p,q,r;
cin>>p>>q>>r;
add(0,p,q,r);
add(1,q,p,r);
}
dijkstra(0,1);
while(que.size()!=0){
que.pop();
}
dijkstra(1,1);
for(i=2;i<=n;i++){
sum+=lowc[0][i]+lowc[1][i];
}
cout<<sum<<endl;
return 0;
}