第一次写SPFA,小激动一下。。。 http://poj.org/problem?id=1511 #include "iostream" #include "stdio.h" #include "queue" #include "string.h" using namespace std; const int MAX = 1000010; const int INF = 1e9; struct edge { int s, e; int val; int nextedge; }; struct edge edges1[MAX], edges2[MAX]; long long dis[MAX]; //各点到起点的距离 int adj1[MAX]; int adj2[MAX]; bool in_queue[MAX]; queue <int> Que; void AddEdge(int s, int e, long long val, int adj[], struct edge edges[], int *lp) { (*lp)++; edges[*lp].s = s; edges[*lp].e = e; edges[*lp].val = val; edges[*lp].nextedge = adj[s]; adj[s] = *lp; //记录起点为s的链表的头结点 } void SPFA(int nStops, int nRoads, int S, int adj[], struct edge edges[]) { int i, h, p, v; memset(in_queue, false, sizeof(in_queue)); for(i = 0; i <= nStops; i++) { dis[i] = INF; } dis[S] = 0; in_queue[S] = true; Que.push(S); while(!Que.empty()) { h = Que.front(); Que.pop(); in_queue[h] = false; for(p = adj[h]; p != -1; p = edges[p].nextedge) { v = edges[p].e; if(dis[v] > dis[h] + (long long)edges[p].val) { dis[v] = dis[h] + (long long)edges[p].val; if(!in_queue[v]) { Que.push(v); in_queue[v] = true; } } } } } int main() { int T, i, j; int s, e; int val; cin >> T; while(T--) { int nStops, nRoads; int lp1 = 0, lp2 = 0; scanf("%d%d", &nStops, &nRoads); memset(adj1, -1, sizeof(adj1)); memset(adj2, -1, sizeof(adj2)); //分别建立正向和反向图 for(i = 1; i <= nRoads; i++) { scanf("%d%d%d", &s, &e, &val); AddEdge(s, e, val, adj1, edges1, &lp1); AddEdge(e, s, val, adj2, edges2, &lp2); } long long sum = 0; SPFA(nStops, nRoads, 1, adj1, edges1); for(i = 1; i <= nStops; i++) sum += dis[i]; SPFA(nStops, nRoads, 1, adj2, edges2); for(i = 1; i <= nStops; i++) sum += dis[i]; printf("%lld\n", sum); } return 0; }
第一次写SPFA,小激动一下。。。
http://poj.org/problem?id=1511