hdu1535 spfa() 如果让我说:我只能说,实力决定一切
来源:互联网 发布:社交网络结尾 编辑:程序博客网 时间:2024/04/30 08:07
//题意:给你一个源点,让你从这个点到所有点的最短路径,然后再返回,让花费最小//正向建图和反向建图#include<iostream>#include<cstdio>#include<vector>#include<queue>#include<string.h>#define inf 1<<30const int maxn=1000010;using namespace std;struct Node{ int v,w;};int T,P,Q;queue<int>qu;vector<Node>V1[maxn];vector<Node>V2[maxn];int vis[maxn];long long cost[maxn];void spfa(int pox,vector<Node>V[]){ for(int i=0; i<=P; i++) { cost[i]=inf; vis[i]=0; } cost[1]=0; qu.push(pox); while(!qu.empty()) { int tem=qu.front(); qu.pop(); vis[tem]=0; for(int i=0; i<V[tem].size(); i++) { Node gh=V[tem][i]; if(cost[gh.v]>cost[tem]+gh.w) { cost[gh.v]=cost[tem]+gh.w; qu.push(gh.v); vis[gh.v]=1; } } }}int main(){ int uu,vv,ww; long long ans; Node tem1,tem2; scanf("%d",&T); while(T--) { ans=0; scanf("%d%d",&P,&Q); for(int i=1; i<=P; i++) { V1[i].clear(); V2[i].clear(); } for(int i=0; i<Q; i++) { scanf("%d%d%d",&uu,&vv,&ww); tem1.v=uu; tem1.w=ww; tem2.v=vv; tem2.w=ww; V1[uu].push_back(tem2); V2[vv].push_back(tem1); } spfa(1,V1); for(int i=2; i<=P; i++) { ans+=cost[i]; } spfa(1,V2); for(int i=2; i<=P; i++) { ans+=cost[i]; } printf("%lld\n",ans); } return 0;}