http://poj.org/problem?id=1511
题意:现有一些ACMERS需要坐车从1号站分别抵达2,3,....N(N<=1000000000)号站,等到晚上后,他们再各自从各自所在的位置返回到1号站。从 i - j 站的价钱是不等的, 问你他们所需的最小花费是多少?
分析:由于给出的点太多了,只能用 spfa 算法了。。

#include<stdio.h> #include<string.h> #include<math.h> #include<queue> #include<algorithm> using namespace std; typedef long long LL; #define maxn 1000010 #define oo 0x3f3f3f3f int head[maxn], v[maxn], num[maxn], dist[maxn], a[maxn], b[maxn], c[maxn]; int n, cnt; LL sum; struct node { int u, v, next, w; }maps[maxn]; void Add(int u, int v, int w) { maps[cnt].v = v; maps[cnt].w = w; maps[cnt].next = head[u]; head[u] = cnt++; } void Init() { for(int i=1; i<=n; i++) dist[i] = oo; dist[1] = 0; memset(v, 0, sizeof(v)); memset(num, 0, sizeof(num)); memset(head, -1, sizeof(head)); cnt = 0; } void spfa() { queue<int>Q; Q.push(1); v[1]=1; num[1]++; while(Q.size()) { int p=Q.front(); Q.pop(); v[p]=0; for(int i=head[p]; i!=-1; i=maps[i].next) { int q=maps[i].v; if(dist[q]>dist[p]+maps[i].w) { dist[q]=dist[p]+maps[i].w; if(!v[q]) { v[q]=1; num[q]++; Q.push(q); if(num[q]>n) return; } } } } for(int i=1; i<=n; i++) sum += dist[i]; return ; } int main() { int T, m; scanf("%d", &T); while(T --) { scanf("%d %d", &n, &m); Init(); for(int i=1; i<=m; i++) { scanf("%d %d %d", &a[i], &b[i], &c[i]); Add(a[i], b[i], c[i]); } sum = 0; spfa(); Init(); for(int i=1; i<=m; i++) { Add(b[i], a[i], c[i]); } spfa(); printf("%I64d ", sum); } return 0; }