#include<stdio.h>#include<string.h>#include<vector>#include<queue>#define ll long long#define N 1000005#define INF 0xFFFFFFFFusing namespace std;struct node{ int start; int end; ///边的末端顶点 int v; ///边的权值}nn[N];vector <node> p[N];ll d[N];int vis[N];int m,n;ll spfa(){ ll i; memset(vis,0,sizeof(vis)); for(i=2;i<=n;i++) d[i]=INF; d[1]=0; queue<int> q; q.push(1); while(!q.empty()){ int tmp=q.front(); q.pop(); vis[tmp]=0; for(i=0;i<p[tmp].size();i++){ int v=p[tmp][i].v; ///与tmp相连的第i个节点之间的权值 int end=p[tmp][i].end; ///与tmp相连的第i个节点的节点值 if(d[end]>d[tmp]+v){ d[end]=d[tmp]+v; if(!vis[end]){///如果队列中没有,加入队列 q.push(end); vis[end]=1; } } } } ll sum=0; for(i=1;i<=n;i++){ sum+=d[i]; } return sum;}int main(){ ll i; int t; scanf("%d",&t); while(t--){ scanf("%d%d",&n,&m); for(i=0;i<=n;i++){ p[i].clear(); } for(i=1;i<=m;i++){///建邻接表 scanf("%d%d%d",&nn[i].start,&nn[i].end,&nn[i].v); node no; no.end=nn[i].end; no.v=nn[i].v; p[nn[i].start].push_back(no); } ll minsum=spfa(); for(i=0;i<=n;i++){ p[i].clear(); } for(i=1;i<=m;i++){///交换顶点后重新建邻接表 node nod; nod.end=nn[i].start; nod.v=nn[i].v; p[nn[i].end].push_back(nod); } minsum+=spfa(); printf("%I64d/n",minsum); } return 0;}
新闻热点
疑难解答