zoukankan      html  css  js  c++  java
  • pat06-图5. 旅游规划(25)

    06-图5. 旅游规划(25)

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard

    有了一张自驾旅游路线图,你会知道城市间的高速公路长度、以及该公路要收取的过路费。现在需要你写一个程序,帮助前来咨询的游客找一条出发地和目的地之间的最短路径。如果有若干条路径都是最短的,那么需要输出最便宜的一条路径。

    输入格式说明:

    输入说明:输入数据的第1行给出4个正整数N、M、S、D,其中N(2<=N<=500)是城市的个数,顺便假设城市的编号为0~(N-1);M是高速公路的条数;S是出发地的城市编号;D是目的地的城市编号。随后的M行中,每行给出一条高速公路的信息,分别是:城市1、城市2、高速公路长度、收费额,中间用空格分开,数字均为整数且不超过500。输入保证解的存在。

    输出格式说明:

    在一行里输出路径的长度和收费总额,数字间以空格分隔,输出结尾不能有多余空格。

    样例输入与输出:

    序号 输入 输出
    1
    4 5 0 3
    0 1 1 20
    1 3 2 30
    0 3 4 10
    0 2 2 20
    2 3 1 20
    
    3 40
    
    2
    2 1 0 1
    1 0 2 3
    
    2 3
    

    提交代码

    方法一:邻接矩阵,时间复杂度O(N^2)

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<cstring>
     5 #include<queue>
     6 #include<vector>
     7 #include<cmath>
     8 #include<string>
     9 using namespace std;
    10 #define inf 260000
    11 struct node{
    12     int dist,cost;
    13 };
    14 node Map[505][505];
    15 int dist[505],cost[505],n,m,s,d;
    16 int main(){
    17     //freopen("D:\INPUT.txt","r",stdin);
    18     scanf("%d %d %d %d",&n,&m,&s,&d);
    19 
    20     //cout<<n<<" "<<m<<" "<<s<<" "<<d<<endl;
    21 
    22     int i,j,a,b,dis,cos;
    23     for(i=0;i<n;i++){//初始化
    24         dist[i]=inf;
    25         cost[i]=inf;
    26         for(j=0;j<n;j++){
    27             Map[i][j].dist=Map[j][i].dist=inf;
    28             Map[i][j].cost=Map[j][i].cost=inf;
    29         }
    30     }
    31     for(i=0;i<m;i++){
    32        scanf("%d %d %d %d",&a,&b,&dis,&cos);
    33        Map[a][b].cost=Map[b][a].cost=cos;
    34        Map[a][b].dist=Map[b][a].dist=dis;
    35 
    36        //cout<<a<<" "<<b<<" "<<cos<<" "<<dis<<endl;
    37 
    38     }
    39     int cur=s,mindist=inf,mincost=inf,minnum;
    40     dist[s]=cost[s]=0;
    41     while(cur!=d){
    42 
    43         //cout<<dist[cur]<<endl;
    44 
    45         for(i=0;i<n;i++){
    46             if(dist[i]>dist[cur]+Map[cur][i].dist){
    47                dist[i]=dist[cur]+Map[cur][i].dist;
    48                cost[i]=cost[cur]+Map[cur][i].cost;
    49             }
    50             else{
    51                 if(dist[i]==dist[cur]+Map[cur][i].dist&&cost[i]>cost[cur]+Map[cur][i].cost){
    52                     cost[i]=cost[cur]+Map[cur][i].cost;
    53                 }
    54             }
    55         }
    56         dist[cur]=cost[cur]=0;//入队
    57         mindist=inf,mincost=inf;
    58         for(i=0;i<n;i++){//find min
    59             if(dist[i]){
    60                 if(mindist>dist[i]){
    61                     mindist=dist[i];
    62                     mincost=cost[i];
    63                     minnum=i;
    64                 }
    65                 else{
    66                     if(mindist==dist[i]&&mincost>cost[i]){
    67                         mincost=cost[i];
    68                         minnum=i;
    69                     }
    70                 }
    71             }
    72         }
    73         cur=minnum;
    74     }
    75     printf("%d %d
    ",dist[d],cost[d]);
    76     return 0;
    77 }
  • 相关阅读:
    iis 7.5应用程序池自动停止
    百度云推送
    两点经纬度之间距离计算
    集合已修改;可能无法执行枚举操作。
    【百度地图】- 学习.1
    阿里云服务器下安装LAMP环境(CentOS Linux 6.3)
    微信相关内容
    阿里云服务器下安装LAMP环境(CentOS Linux 6.3)
    php面试相关
    MySQL权限管理
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4756372.html
Copyright © 2011-2022 走看看