poj 1511 Invitation Cards (SPFA、邻接表)

第一次写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; }


 

转载于:https://www.cnblogs.com/firecoder/archive/2011/08/02/2512223.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值