//题意:给你一个源点,让你从这个点到所有点的最短路径,然后再返回,让花费最小
//正向建图和反向建图
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<string.h>
#define inf 1<<30
const 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;
}
hdu1535 spfa() 如果让我说:我只能说,实力决定一切
最新推荐文章于 2021-08-20 16:53:00 发布