标签:des style blog http io ar color os 使用
Description
Input
Output
Sample Input
2 2 2 1 2 13 2 1 33 4 6 1 2 10 2 1 60 1 3 20 3 4 10 2 4 5 4 1 50
Sample Output
46 210
Source
SPFA的典型应用,不过就是需要两次建图,一次从站1出发,一次从其他站回来,这个时候逆向建图,然后两次调用SPFA算法,求得的最短路加起来就得到解了。
注意不要溢出。
不使用vector,stack这些STL容器果然快点的。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <set>
#include <vector>
#include <limits.h>
#include <string.h>
#include <stack>
#include <algorithm>
using namespace std;
const int MAX_N = 1000001;
struct Edge
{
int src, des, wei, next;
};
Edge eds[MAX_N];//edges' pool
int edsNum;//the total numbers of edges
int head[MAX_N];//the head edge indicator of all vertices
const int EDGE_END= -1;
void addEdge(int src, int des, int wei)
{
eds[edsNum].src = src;
eds[edsNum].des = des;
eds[edsNum].wei = wei;
eds[edsNum].next = head[src];
head[src] = edsNum++;
}
inline int nextEdge(int e)
{
return eds[e].next;
}
template<typename T>
inline bool equ(T a, T b) { return a == b; }
int dist[MAX_N], stk[MAX_N];
bool inStk[MAX_N];
void shortestSpanningTreeSPFA(int n)
{
fill(dist, dist+n+1, INT_MAX);
fill(inStk, inStk+n+1, false);
dist[1] = 0;
int top = -1;
stk[++top] = 1;
inStk[1] = true;
while (top != -1)
{
int u = stk[top--];
inStk[u] = false;
for (int e = head[u]; e != EDGE_END; e = nextEdge(e))
{
int v = eds[e].des, w = eds[e].wei;
if (dist[u] + w < dist[v])
{
dist[v] = dist[u] + w;
if (!inStk[v])
{
stk[++top] = v;
}
}
}
}
}
void reverseGrap(int V, int E)
{
fill(head, head+V+1, EDGE_END);
for (int e = 0; e < E; e++)
{
swap(eds[e].des, eds[e].src);
eds[e].next = head[eds[e].src];
head[eds[e].src] = e;
}
}
int main()
{
int T, V, E, u, v, w;
scanf("%d", &T);
while (T--)
{
scanf("%d %d", &V, &E);
fill(head, head+V+1, EDGE_END);
edsNum = 0;
for (int i = 0; i < E; i++)
{
scanf("%d %d %d", &u, &v, &w);
addEdge(u, v, w);//顶点下标由1开始
}
shortestSpanningTreeSPFA(V);
long long ans = 0LL;
for (int i = 1; i <= V; i++)
{
ans += dist[i];
}
reverseGrap(V, E);
shortestSpanningTreeSPFA(V);
for (int i = 1; i <= V; i++)
{
ans += dist[i];
}
printf("%lld\n", ans);
}
return 0;
}
POJ 1511 Invitation Cards 图论题解
标签:des style blog http io ar color os 使用
原文地址:http://blog.csdn.net/kenden23/article/details/41448807