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 }
  • 相关阅读:
    【SW4STM32生成 hex文件的设置方法】
    【004:结构体内存地址的连续问题】
    【003:使用SW4STM32不进入中断的原因】
    [转载来之雨松:NGUI研究院之为什么打开界面太慢(十三)]
    【错误总结1:unity StartCoroutine 报 NullReferenceException 错误】
    【场景切换的多种调用方式】
    【Lua学习笔记之:Lua环境搭建 Windows 不用 visual studio】
    【KeyCode 键码】
    mysql
    numpy
  • 原文地址:https://www.cnblogs.com/Deribs4/p/4756372.html
Copyright © 2011-2022 走看看