【反向建立边】【spfa】【仿vector设计】

来源:互联网 发布:淘宝比较靠谱的代运营 编辑:程序博客网 时间:2024/06/06 05:25





#include <iostream>#include <cstring>#include <cmath>#include <queue>#include <stack>#include <list>#include <map>#include <set>#include <string>#include <cstdlib>#include <cstdio>#include <algorithm>using namespace std;    #define rep(i,a,n) for (int i=a;i<n;i++)#define per(i,a,n) for (int i=n-1;i>=a;i--)#define mp push_backint T,n,m;int H[1000100];int x[1000100];int y[1000100];int z[1000100];long long d[1000100];int top;struct Node{int v,c,next;}node[1000100];void addedge(int u,int v,int c){node[top].v = v;node[top].c = c;node[top].next = H[u];H[u] = top++;}long long spfa(int s){   queue<int> Q;   Q.push(s);   memset(d,0x3f3f3f3f,sizeof(d));   d[s] = 0;   while(!Q.empty())   {   int cur = Q.front();   Q.pop();   for(int i=H[cur];i!=-1;i=node[i].next)   {   if(d[node[i].v] > d[cur] + node[i].c)   {  d[node[i].v] = d[cur] + node[i].c;  Q.push(node[i].v);   }   }   }   int mins = 0x3f3f3f3f;   long long ret = 0;   rep(i,1,n+1) ret += d[i];   return ret;}int main(){scanf("%d",&T);while(T--){memset(H,-1,sizeof(H));scanf("%d%d",&n,&m);top = 0;for(int i=0;i<m;i++){scanf("%d%d%d",&x[i],&y[i],&z[i]);}rep(i,0,m) addedge(x[i],y[i],z[i]);long long ans = spfa(1);top = 0;memset(H,-1,sizeof(H));rep(i,0,m) addedge(y[i],x[i],z[i]);ans += spfa(1);printf("%I64d\n",ans);}    return 0;}


0 0
原创粉丝点击