Dijkstra算法:POJ No 3268 Silver Cow Party

题目: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
", ans);
}
 
int main()
{
    solve();
    
    return 0;
    
}
原文地址:https://www.cnblogs.com/douzujun/p/6891854.html