zoukankan      html  css  js  c++  java
  • [HDU] 1874 畅通工程续基本单源路径粗糙实现

    题目链接:

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

    方法:使用邻接表,将两个点之间的所有边都用一条最小费用的边来代表。然后用这些边来建立图并调用DIJKSTRA,最后判断到目标定点的距离是不是正无穷,不是正无穷的值就是最小路径的费用权值。

    感想:用数组每次排序没有在选择的点的方法来模拟优先队列不好,以后要用堆来模拟。

    代码:

    View Code
    #include<iostream>
    #include<algorithm>
    using namespace std;
    int const MAX =0x3f3f3f3f;
    int cityCount,roadsCount;
    int matrix[201][201];
    struct cityDistance
    {
        int city;
        int _distance;
    };
    cityDistance distances[201];
    bool visisted[201];
    int cmp( cityDistance a, cityDistance b) 
    {
        if (a._distance < b._distance) 
            return 1;    
        else return 0; 
    }
    int main()
    {     
        while(scanf("%d %d",&cityCount,&roadsCount)!=EOF)
        {
             int st,ed,cost;
             memset(matrix,MAX,sizeof(matrix));
             memset(visisted,false,sizeof(visisted));
             for(int i =0;i<cityCount;i++)
             {
                distances[i].city=i;
                distances[i]._distance = MAX;
                matrix[i][i]=0;
             }
             for(int i=0;i<roadsCount;i++)
             {
                scanf("%d %d %d",&st,&ed,&cost);
                if(cost<matrix[st][ed])
                    matrix[st][ed] = matrix[ed][st] =cost;
             }
             scanf("%d %d",&st,&ed);    
             if(st==ed)
                 cout<<0<<endl;
             else
             {
                 distances[st]._distance = 0;
                 int t_c=0;
                 sort(distances+t_c,distances+cityCount,cmp);
         
                 while(t_c<cityCount)
                 {
                     int t = distances[t_c].city;
                     int t_dist =  distances[t_c]._distance ; 
                      t_c++;
                     visisted[t] = true;
                     for(int i=0;i<cityCount;i++)
                     {
                         if(!visisted[distances[i].city] && matrix[t][distances[i].city]!=MAX)
                             distances[i]._distance = t_dist+matrix[t][distances[i].city] < distances[i]._distance ? t_dist+matrix[t][distances[i].city] : distances[i]._distance;
                     }
                     sort(distances+t_c,distances+cityCount,cmp);//以后这里要改成堆  不用stl优先队列的堆 是自己写的堆
                 }
                 int re =0;
                 for(int i=0;i<cityCount;i++)
                 {
                     if(distances[i].city == ed)
                         re = distances[i]._distance;
                 }
                 if(re ==MAX)
                     cout<<-1<<endl;
                 else
                    cout<<re<<endl;
             }
        }
        return 0;
    } 
  • 相关阅读:
    点云数据的存储格式
    模块编写流程
    特征描述子
    指针和引用的差别
    内联函数和宏定义的差别
    哪些函数不能为virtual函数
    如何定义一个只能在堆上(栈上)生成对象的类
    对象深拷贝问题
    Warning: Failed prop type: Invalid prop `value` supplied to `Picker`.报错问题
    解决多层数组、对象深拷贝问题
  • 原文地址:https://www.cnblogs.com/kbyd/p/3021322.html
Copyright © 2011-2022 走看看