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;

}

 

 

你可能感兴趣的:(最短路径)