#include <queue>#include <algorithm>#include <cstring>#include <cstdio>using namespace std;typedef long long ll;const int maxn = 1E6 + 20;const int maxm = 1E6 + 20;int head[maxn],nxt[maxm],mend[maxm],cost[maxm];void addedge(int u,int v, int c){static int q = 2;mend[q] = v;nxt[q] = head[u];cost[q] = c;head[u] = q++;}struct Edge{int u,v,c;Edge(int _u = 0, int _v = 0,int _c = 0):u(_u),v(_v),c(_c){}}e[maxn];struct mNode{ll u,c;mNode(ll _u = 0,ll _c = 0):u(_u),c(_c){}bool operator < (const mNode & a)const{return c > a.c;}};bool vis[maxn];ll d[maxn];ll Dijkstra(int s,int n){memset(vis,0,sizeof(bool) * (n + 2));memset(d,0x3f,sizeof(ll) * (n + 2));priority_queue<mNode> q;d[s] = 0;q.push(mNode(s,0));mNode tmp;while(!q.empty()){tmp = q.top();q.pop();int u = tmp.u;if(vis[u]) continue;vis[u] = 1;for(int qq = head[u];~qq;qq = nxt[qq]){int v = mend[qq];if(!vis[v] && d[v] > d[u] + cost[qq]){d[v] = d[u] + cost[qq];q.push(mNode(v,d[v]));}}}ll ans = 0;for(int i = 2; i <= n ; ++i)ans += d[i];return ans;}inline void ini(int n){memset(head,-1,sizeof(int)*(n + 2));}int main(){int t,n,m,a,b,c;scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);ini(n);for(int i = 0;i < m ; ++i){scanf("%d%d%d",&a,&b,&c);e[i] = Edge(a,b,c);addedge(a,b,c);}ll ans;ans = Dijkstra(1,n);ini(n);for(int i = 0;i < m ; ++i){addedge(e[i].v,e[i].u,e[i].c);}ans += Dijkstra(1,n);printf("%I64d\n",ans);}return 0;}
[2016-04-05][POJ][1511][Invitation Cards]
原文:http://www.cnblogs.com/qhy285571052/p/c20ae82b86c28c48b4c5b5cd5bc88162.html