zoukankan      html  css  js  c++  java
  • 单源最短路径问题 Dijkstra 贪心法

    一维数组d[i]中存放从原点s到结点i的当前最短路径的长度;

    一维整型数组path[i]存放从原点到结点i的当前最短路径上,结点i的前一个结点。

    程序如下:

    #include<iostream>
    #include<cmath>
    #include<fstream>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int INFTY=2147483647-1000000;
    const int N=100;
    int a[N][N],n;  //a是有向图的邻接矩阵
    int *d;
    int *path;
    int Choose(int *d,bool *s)
    {
        int i,minpos,min;
        min=INFTY;minpos=-1;
        for(i=0;i<n;i++)
        {
            if(d[i]<min && !s[i]){
                min=d[i];
                minpos=i;
            }
        }
        return minpos;
    }
    void Dijkstra(int s,int* &d,int* &path)
    {
        int k,i,j;
        if(s<0||s>n-1)  cout<<"OutOfBounds!";
        bool *inS=new bool[n+1];
        d=new int[n+1];
        path=new int[n+1];
        for(i=0;i<n;i++){      //初始化
            inS[i]=false;
            d[i]=a[s][i];
            if(i!=s && d[i]<INFTY) path[i]=s;
            else path[i]=-1;
        }
        inS[s]=true;d[s]=0;   //将原点加入S中
        for(i=1;i<n;i++)      //求n-1条最短路径
        {
            k=Choose(d,inS);  //选出下一条最短路径的结点k
            inS[k]=true;      //将k加入S中
            for(j=0;j<n;j++)  //更新d和path的值
                if(!inS[j] && d[k]+a[k][j]<d[j])
                {
                    d[j]=d[k]+a[k][j];
                    path[j]=k;
                }
        }
    }
    int main()
    {
      //freopen("data.in","r",stdin);
        cout<<"输入结点个数: ";
        cin>>n;
        int s,t,w;
        cout<<"输入结点关系及权值(以Ctrl+Z结束): "<<endl;
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
            a[i][j]=INFTY;
        while(cin>>s>>t>>w){
            a[s][t]=w;
        }
        cout<<endl;
        Dijkstra(0,d,path);
        for(int i=1;i<n;i++)
            cout<<"0到"<<i<<"最短路径: "<<d[i]<<" "<<path[i]<<endl;
        return 0;
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    【翻译】ASP.NET Web API入门
    ASP.NET Web API 简介
    浅析利用MetaWeblog接口同步多个博客
    说说JSON和JSONP,也许你会豁然开朗
    说说JSON和JSONP,也许你会豁然开朗
    点击ListView 获取所选择行的数据
    Label 控件设置背景透明色
    C#遍历窗体所有控件或某类型所有控件 (转)
    使用Window 自带的控件 axWindowsMediaPlayer 制作播放器
    ASP.net 学习路线(详细)
  • 原文地址:https://www.cnblogs.com/Tobyuyu/p/4965366.html
Copyright © 2011-2022 走看看