HDU 1874 单源最短路径

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

中文题,纯单源最短路径。

题目有点小坑,就是在输入权值时,要判断下,

如:之前输入了g[1][4] = 100, 但是可能后面还有输入g[1][4] = 200

View Code
/**
 * DIJKSTRA(简单版) 单源最短路径算法(不允许存在负边)
 * 输入:(1)图g;        // 有向图或者无向图 
 *       (2)源点s。 
 * 输出:(1)源点s到各点的最短路径长dist; 
 *       (2)源点s到各点的最短路径prev。
 * 结构: 图g用邻接矩阵表示,最短路径长dist用数组表示。 
 * 算法:Dijkstra算法  
 * 复杂度:O(|V|^2) 
 */ 
//HDU1874
#include<iostream>
#include <iterator>
#include<vector>
using namespace std;
int n;//顶点
vector<vector<int> > g;  //路径权值
int s;//源点
vector<bool> known ;  //是否已求得该点最短路径
vector<int> dist;    //该点到源点s 的距离
vector<int> pre;   // 该点最短路径的前一个点
void Dijkstra()
{
    known.assign(n,false);
    dist.assign(n,INT_MAX);
    //pre.resize(n);
    dist[s]=0;   //源点到本身距离为0
    while(1){
        int mmin=INT_MAX,v=s;
        for(int i=0;i<n;++i)    //假设该点为终点,求出该点最短路径
            if(!known[i]&&mmin>dist[i])   
                mmin=dist[i],v=i;
        known[v]=true;
        if(mmin==INT_MAX) break;   //known全部为true了,即全面找到了最短路径
        for(int w=0;w<n;++w)
            if(!known[w]&&g[v][w]<INT_MAX&&dist[w]>dist[v]+g[v][w])
                dist[w]=dist[v]+g[v][w];
    }
}

int main()
{
    int m, i, a, b, x;
    while (cin>>n>>m)
    {
        g.assign(n,vector<int>(n,INT_MAX));
        for (i=0; i<m; i++)
        {
            cin>>a>>b>>x;
            if(g[a][b]>x)    //注意!!
                g[a][b]=g[b][a]=x;
        }
        cin>>s>>b;
        Dijkstra();
        if (dist[b] == INT_MAX)
            cout<<"-1"<<endl;
        else
            cout<<dist[b]<<endl;
        
    }
    return 0;
}

 

 

posted @ 2013-04-13 18:25  旅行的蜗牛  阅读(192)  评论(0编辑  收藏  举报