您的位置:首页 > 其它

Dijkstra算法:POJ No 3268 Silver Cow Party

2017-05-22 22:36 369 查看
题目:http://poj.org/problem?id=3268

题解:使用 priority_queue队列对dijkstra算法进行优化

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <functional>
#include <cstring>
using namespace std;

const int MAX_V  = 1024 + 10;
const int INF = 99999999;

struct edge
{
int to, cost;
edge() {}
edge(int to, int cost) : to(to), cost(cost) {}
};
typedef pair<int, int> P;  //first 最短路径, second顶点编号
vector<edge> G[MAX_V];     //图
int d[MAX_V][MAX_V];       //最短距离
int V, E, X;               //V顶点数,E是边数

//求解从顶点s出发到所有点的最短距离
void dijkstra(int s)
{
//升序
priority_queue<P, vector<P>, greater<P> > que;
memset(d[s], 0x3f, MAX_V * sizeof(int));
d[s][s] = 0;
que.push(P(0, s));   //最短路径,顶点编号

while (!que.empty())
{
//每次出队最小的
P p = que.top(); que.pop();
int v = p.second;          //编号

if (d[s][v] < p.first) continue;

for (unsigned i = 0; i < G[v].size(); ++i)
{
edge e = G[v][i];   //与v临边的顶点
// d[s][e.to]经过 v 再经过其他的临边
if (d[s][e.to] > d[s][v] + e.cost)
{
d[s][e.to] = d[s][v] + e.cost;
que.push(P(d[s][e.to], e.to));
}
}
}
}

void solve()
{
cin >> V >> E >> X;
--X;
int s, t, ct;
while (E--)
{
cin >> s >> t >> ct;
--s; --t;
G[s].push_back(edge(t, ct));
}

for (int i = 0; i < V; i++) {
dijkstra(i);
}

int ans = 0;
for (int i = 0; i < V; ++i) {
if (i == X) continue;

ans = max(ans, d[i][X] + d[X][i]);
}

printf("%d\n", ans);
}

int main()
{
solve();

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: