poj 1511 Invitation Cards (SPFA、邻接表)

来源:互联网 发布:宾得镜头 知乎 编辑:程序博客网 时间:2024/05/02 00:14

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


 

原创粉丝点击