#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
using namespace std;
const int maxn=1000000+5;
const int inf=100000000;
typedef long long LL;
struct edge{
int from,to,dist;
};
struct BellmanFord{
int n,m;
vector<edge> edges;
vector<int> G[maxn];
bool inq[maxn];
LL d[maxn];
int p[maxn];
int cnt[maxn];
void init(int n){
this->n=n;
for(int i=0;i<n;i++) G[i].clear();
edges.clear();
}
void addedge(int from,int to,int dist){
edges.push_back((edge){from,to,dist});
m=(int)edges.size();
G[from].push_back(m-1);
}
void bellmanford(int s){
queue<int> q;
memset(inq,0,sizeof(inq));
memset(cnt,0,sizeof(cnt));
for(int i=0;i<n;i++) d[i]=inf;
d[s]=0;
q.push(s);
inq[s]=true;
while(!q.empty()){
int u=q.front();q.pop();
inq[u]=false;
for(int i=0;i<G[u].size();i++){
edge &e=edges[G[u][i]];
if(d[e.to]>d[u]+e.dist){
d[e.to]=d[u]+e.dist;
p[e.to]=G[u][i];
if(!inq[e.to]) {q.push(e.to);inq[e.to]=true;}
}
}
}
}
};
BellmanFord solver;
int n,m;
int u[maxn],v[maxn],dist[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
solver.init(n);
for(int i=0;i<m;i++){
scanf("%d%d%d",&u[i],&v[i],&dist[i]);
u[i]--;v[i]--;
solver.addedge(u[i],v[i],dist[i]);
}
LL ans=0;
solver.bellmanford(0);
for(int i=0;i<n;i++) ans+=solver.d[i];
solver.init(n);
for(int i=0;i<m;i++) solver.addedge(v[i],u[i],dist[i]);
solver.bellmanford(0);
for(int i=0;i<n;i++) ans+=solver.d[i];
printf("%lld\n",ans);
}
return 0;
}
HDU 1535 Invitation Cards(BellmanFord)
最新推荐文章于 2021-08-10 16:24:50 发布