hdu1874 最短路径 畅通工程续

来源:互联网 发布:管理系统制作软件 编辑:程序博客网 时间:2024/05/29 16:56

迪杰斯特拉Dijkstra  单源最短路径

解题思路:

寻求起点到其余每个点的最短距离

1.给定一个集合S,初始化只包含起点,S={v0},另一个集合U={其他定点},两点是邻接点,有权值,不是,则权值记为无穷大。

找v0到其他点的最短距离,标记之,极为k。

2.通过循环,判断v0经过k点到其他点的距离是否小于没有经过k点的距离,若小于,更新当前v0到其他点的距离

找下一个未标记的点,且v0到它的距离最短,标记之,记为K,重复2.

最终所有点都被标记,循环结束。


有一个实例:




#include<iostream>using namespace std;const int maxnum=1005;const int maxint=99999;int dist[maxnum];//起点到终点的距离int c[maxnum][maxnum];//用于储存两点之间的距离void Dijkstra(int S,int N,int * dist,int  c[maxnum][maxnum]){    bool s[maxnum];//判断是否已加入集合S中    //初始化起始点到其他点的距离    for(int i=0;i<N;i++)    {        dist[i]=c[S][i];        s[i]=0;    }     //起始点被标记,最短距离为0    s[S]=1;    dist[S]=0;    //遍历剩下n-1个点    for(int i=1;i<N;i++)    {        int u=S;        int temp=maxint;        //找出尚未标记的点中,与起始点距离最短的        for(int j=0;j<N;j++)            if(!s[j]&&dist[j]<temp)            {                u=j;                temp=dist[j];            }        s[u]=1;        //最难理解的地方:找到当前已于起始点联通的点的最短距离,随着每一次遍历,会更新,最终达到最短        for(int k=0;k<N;k++)            if(!s[k]&&dist[k]>dist[u]+c[u][k])            {                dist[k]=dist[u]+c[u][k];            }    }}int main (){    int   N,M;    while(cin>>N>>M)    {        int A,B,X;        for(int i=0;i<N;i++)            for(int j=0;j<N;j++)                c[i][j]=maxint;        for(int i=1; i<=N; ++i)           dist[i] = maxint;        for(int i=0;i<M;i++)        {            cin>>A>>B>>X;            if(X<c[A][B])            {                c[A][B]=X;                c[B][A]=X;            }        }        int S,E;        cin>>S>>E;        Dijkstra(S,N,dist,c);        if(dist[E]==maxint)            cout<<"-1"<<endl;        else            cout<<dist[E]<<endl;    }    return 0;}


0 0
原创粉丝点击