Blog·Tanky WooABOUTRSS

HDOJ 1874 畅通工程续

16 Jan 2011
这篇博客是从旧博客 WordPress 迁移过来,内容可能存在转换异常。

传送门:http://acm.hdu.edu.cn/showproblem.php?pid=1874

Dijkstra最简单的应用---直接套模版。

Dijkstra分析与实现(C/C++)见: http://www.wutianqi.com/?p=1890

// Author: Tanky Woo
// Blog:    www.wutianqi.com
#include 
using namespace std;

const int maxnum = 205;
const int maxint = 999999;


void Dijkstra(int n, int v, int *dist, int *prev, int c[maxnum][maxnum])
{
    bool s[maxnum];    // 判断是否已存入该点到S集合中
    for(int i=1; i<=n; ++i)
    {
        dist[i] = c[v][i];
        s[i] = 0;     // 初始都未用过该点
        if(dist[i] == maxint)
            prev[i] = 0;
        else
            prev[i] = v;
    }
    dist[v] = 0;
    s[v] = 1;

    // 依次将未放入S集合的结点中,取dist[]最小值的结点,放入结合S中
    // 一旦S包含了所有V中顶点,dist就记录了从源点到所有其他顶点之间的最短路径长度
    for(int i=2; i<=n; ++i)
    {
        int tmp = maxint;
        int u = v;
        // 找出当前未使用的点j的dist[j]最小值
        for(int j=1; j<=n; ++j)
            if((!s[j]) && dist[j]> p >> q >> len;
            if(len < c[p+1][q+1])
            {
                c[p+1][q+1] = len;      // p指向q
                c[q+1][p+1] = len;      // q指向p,这样表示无向图
            }
        }
        cin >> s >> t;
        for(int i=1; i<=n; ++i)
            dist[i] = maxint;


        Dijkstra(n, s+1, dist, prev, c);

        // 最短路径长度
        if(dist[t+1] != maxint)
            cout << dist[t+1] << endl;
        else
            cout << -1 << endl;
    }
    return 0;
}