zoukankan      html  css  js  c++  java
  • dijkstra最短路径及其输出

    高中同学让我求8个菜市场和35个销售点(他们之间还会有15个路口)之间35*8=280个组合分别的最短路径及其输出。

    最短路水题,嘿嘿。能用自己学到的知识帮助别人解决问题真是极好的享受。

    具体注释可以见代码,写的蛮清楚的。

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    using namespace std; 
    #define INF 0x3f3f3f3 //INF代表无穷大 
    const int MAX_N=100;
    int map[MAX_N][MAX_N],vis[MAX_N];
    int dis[MAX_N];//dis代表到每个点的最短距离 
    int pre[MAX_N];//记录前驱 
    int ans[MAX_N];//输出路径的数组 
    void dijkstr(int x,int m){//x代表开始点,m代表顶点个数 
        for(int i=1;i<=m;i++){
            dis[i]=map[x][i];
            vis[i]=0;
            if(map[x][i]!=INF)
            pre[i]=x;
            else
            pre[i]=-1; 
        }
        int p;
        vis[x]=1;
        for(int i=1;i<=m;i++){
               int min=INF;
               for(int j=1;j<=m;j++){
                   if(!vis[j]&&dis[j]<min){
                       min=dis[j];
                       p=j;
                   }       
               }
               vis[p]=1;
            for(int j=1;j<=m;j++){
                if(!vis[j]&&dis[p]+map[p][j]<dis[j])
                {
                   dis[j]=dis[p]+map[p][j];
                   pre[j]=p;
                }
                
            }           
        }
    }
    
    int main(){
        int m,n,a,b,c;
        //输入文件中数字含义:1-8为基地,9-43为销售点,44-58是路口,格式为 点 点 距离 
         
        freopen("in.txt","r",stdin);//从文件中读出数据 
        freopen("out.txt","w",stdout);//输出结果至文件 
        void dijkstr(int x,int n);
         //  cout<<"请输入点的个数和边的条数"<<endl; 
           cin>>m>>n;
            memset(vis,0,sizeof(vis));//m个点,n条边 
            for(int i=1;i<=m;i++)
            for(int j=1;j<=m;j++){
                 map[i][j]=INF;
            }
        //    cout<<"请依次按照起点,终点,距离的顺序输入边"<<endl;
            for(int j=1;j<=n;j++){
                cin>>a>>b>>c;
                map[a][b]=map[b][a]=c;
            }
            
           for(int i=1;i<=8;i++)
          {
            dijkstr(i,m);
            for(int j=9;j<=43;j++){
                int k=j;
                cout<<"从基地"<<i<<"到销售点"<<(j-8)<<"的最短距离是:"<<dis[k]<<endl; 
            int p,len=1;
            p=k;
            while(p>=1)
            {
               ans[len++]=p;
               p=pre[p];
            }
           int first=0; 
           cout<<"下面是具体路径: "<<endl;
           for(int r=len-1;r>=1;r--)
           {
                if(first++)
                cout<<"->";
                if(ans[r]>=1&&ans[r]<=8)
                cout<<"基地"<<ans[r];
                else if(ans[r]>=9&&ans[r]<=43)
                cout<<"销售点"<<ans[r]-8;
                else
                cout<<"路口"<<ans[r]-43;
              }
           cout<<endl;
           cout<<endl; 
         }
        }
        
        return 0;
    }

    out文件中的结果预览:

    详细数据和源代码提供下载: https://files.cnblogs.com/files/Tach-ac/%E6%9C%80%E7%9F%AD%E8%B7%AF.rar

  • 相关阅读:
    1292
    explicit_defaults_for_timestamp
    比较好的平台工具
    git回退到指定版本的代码
    解决catalina.out文件过大的方法
    json字符串转化成对象列表数据
    Java LIST做批量分组切割
    Activiti数据库表结构
    MySQL修改数据库时区
    集合工具类的使用
  • 原文地址:https://www.cnblogs.com/Tach-ac/p/4471811.html
Copyright © 2011-2022 走看看