zoukankan      html  css  js  c++  java
  • SDUT 3363 数据结构实验之图论七:驴友计划

    数据结构实验之图论七:驴友计划

    Time Limit: 1000MS Memory Limit: 65536KB

    Problem Description

    做为一个资深驴友,小新有一张珍藏的自驾游线路图,图上详细的标注了全国各个城市之间的高速公路距离和公路收费情况,现在请你编写一个程序,找出一条出发地到目的地之间的最短路径,如果有多条路径最短,则输出过路费最少的一条路径。

    Input

    连续T组数据输入,每组输入数据的第一行给出四个正整数N,M,s,d,其中N(2 <= N <= 500)是城市数目,城市编号从0~N-1,M是城市间高速公路的条数,s是出发地的城市编号,d是目的地的城市编号;随后M行,每行给出一条高速公路的信息,表示城市1、城市2、高速公路长度、收费额,中间以空格间隔,数字均为整数且不超过500,输入数据均保证有解。 

    Output

    在同一行中输出路径长度和收费总额,数据间用空格间隔。 

    Example Input

    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

    Example Output

    3 40

    DQE:

    解法一(推荐):迪杰斯特拉算法,在双权无向图中做小修改即可。
     
     1 #include <iostream>
     2 #include <cstdio>
     3 #include <climits>
     4 
     5 using namespace std;
     6 
     7 #define MVN 510
     8 
     9 typedef struct AdjMatrix
    10 {
    11     int w;    //距离
    12     int m;    //费用
    13     char *info;
    14 }AM;
    15 
    16 typedef struct MGraph
    17 {
    18     int vex[MVN];
    19     AM arc[MVN][MVN];
    20     int vexn,arcn;
    21     int s,e;    //起点,终点(编号-下标)
    22 }MG;
    23 
    24 void creat(MG &G)
    25 {
    26     int i,j,w,m,k;
    27     for(i=0;i<G.vexn;i++)
    28         for(j=0;j<G.vexn;j++)
    29         {
    30             G.arc[i][j].w=INT_MAX;
    31             G.arc[i][j].m=0;
    32         }
    33     for(k=0;k<G.arcn;k++)
    34     {
    35         scanf("%d %d %d %d",&i,&j,&w,&m);
    36         G.arc[i][j].w=G.arc[j][i].w=w;
    37         G.arc[i][j].m=G.arc[j][i].m=m;
    38     }
    39 }
    40 
    41 struct{int w,m;}D[MVN];        //辅助数组{当前最短距离和,当前费用和}
    42 void short_p(MG &G)
    43 {
    44     bool f[MVN]={false};    //是否锁定为最短路径
    45     int i,j,k,min;
    46     //初始化辅助数组并锁定起点
    47     for(k=0;k<G.vexn;k++)
    48     {
    49         D[k].w=G.arc[G.s][k].w;
    50         D[k].m=G.arc[G.s][k].m;
    51     }
    52     f[G.s]=true;
    53     //选择并锁定下一最短路径顶点
    54     for(k=1;k<G.vexn;k++)
    55     {
    56         min=INT_MAX;
    57         for(j=0;j<G.vexn;j++)
    58             if(!f[j])
    59                 if(D[j].w<min)
    60                 {
    61                     i=j;
    62                     min=D[j].w;
    63                 }
    64         f[i]=true;
    65         //更新该顶点的邻接点的最短路
    66         for(j=0;j<G.vexn;j++)
    67             if(!f[j]&&G.arc[i][j].w<INT_MAX)
    68                 if(min+G.arc[i][j].w<D[j].w)
    69                 {
    70                     D[j].w=min+G.arc[i][j].w;
    71                     D[j].m=D[i].m+G.arc[i][j].m;
    72                 }
    73                 else if(min+G.arc[i][j].w==D[j].w && D[i].m+G.arc[i][j].m<D[j].m)    //距离相同时选择费用更少
    74                     D[j].m=D[i].m+G.arc[i][j].m;
    75     }
    76 }
    77 
    78 int main()
    79 {
    80     int t;
    81     scanf("%d",&t);
    82     while(t--)
    83     {
    84         MG G;
    85         scanf("%d %d %d %d",&G.vexn,&G.arcn,&G.s,&G.e);
    86         creat(G);
    87         short_p(G);
    88         printf("%d %d
    ",D[G.e].w,D[G.e].m);
    89     }
    90     return 0;
    91 }
    92 
    93 /***************************************************
    94 User name: ***
    95 Result: Accepted
    96 Take time: 0ms
    97 Take Memory: 176KB
    98 Submit time: 2016-11-17 18:23:42
    99 ****************************************************/

    解法二(不推荐):深度优先搜索,注意搜索过程中的回退需要清除相关标记。

     
      1 #include <iostream>
      2 #include <cstdio>
      3 #include <climits>
      4 
      5 using namespace std;
      6 
      7 #define MVN 550
      8 
      9 typedef struct AdjMatrix
     10 {
     11     int w;
     12     int m;
     13     char *info;
     14 }AM;
     15 
     16 typedef struct MGraph
     17 {
     18     int vex[MVN];
     19     AM arc[MVN][MVN];
     20     int vexnum,arcnum;
     21     int s,d;
     22     int w,m;
     23     int minw,minm;
     24 }MG;
     25 
     26 void creat(MG &G)
     27 {
     28     int i,j,w,m,k;
     29     for(k=0;k<G.vexnum;k++)
     30         G.vex[k]=k;
     31     for(k=0;k<G.arcnum;k++)
     32     {
     33         scanf("%d %d %d %d",&i,&j,&w,&m);
     34         G.arc[i][j].w=w;
     35         G.arc[i][j].m=m;
     36         G.arc[j][i].w=w;
     37         G.arc[j][i].m=m;
     38     }
     39 }
     40 
     41 void DFS(MG &G,bool *visited,int i)
     42 {
     43     visited[i]=true;
     44     if(i==G.d)
     45     {
     46         if(G.w<G.minw || G.w==G.minw && G.m<G.minm)
     47         {
     48             G.minw=G.w;
     49             G.minm=G.m;
     50         }
     51     }
     52     else
     53     {
     54         int k;
     55         for(k=0;k<G.vexnum;k++)
     56         {
     57             if(G.arc[i][k].w<INT_MAX&&visited[k]==false)
     58             {
     59                 G.w+=G.arc[i][k].w;
     60                 G.m+=G.arc[i][k].m;
     61                 DFS(G,visited,k);
     62 
     63                 visited[k]=false;        //※探索不同路径后的回退操作※
     64                 G.w-=G.arc[i][k].w;
     65                 G.m-=G.arc[i][k].m;
     66             }
     67         }
     68     }
     69 }
     70 
     71 int main()
     72 {
     73     int t;
     74     scanf("%d",&t);
     75     while(t--)
     76     {
     77         MG G={0};
     78         scanf("%d %d %d %d",&G.vexnum,&G.arcnum,&G.s,&G.d);
     79         int k,o;
     80         for(k=0;k<G.vexnum;k++)
     81         {
     82             for(o=0;o<G.vexnum;o++)
     83                 G.arc[k][o].w=INT_MAX;
     84         }//初始化邻接矩阵
     85         creat(G);
     86         bool visited[MVN]={false};
     87         G.minm=INT_MAX;        //初始化一个最大值
     88         G.minw=INT_MAX;
     89         DFS(G,visited,G.s);
     90         printf("%d %d
    ",G.minw,G.minm);
     91     }
     92     return 0;
     93 }
     94 
     95 /***************************************************
     96 User name: ***
     97 Result: Accepted
     98 Take time: 0ms
     99 Take Memory: 2832KB
    100 Submit time: 2016-11-09 22:46:01
    101 ****************************************************/
  • 相关阅读:
    斐波那契数列 的两种实现方式(Java)
    单链表反转
    单链表合并
    两个有序list合并
    list去重 转载
    RemoveAll 要重写equals方法
    Java for LeetCode 138 Copy List with Random Pointer
    Java for LeetCode 137 Single Number II
    Java for LeetCode 136 Single Number
    Java for LeetCode 135 Candy
  • 原文地址:https://www.cnblogs.com/Leroscox/p/6049201.html
Copyright © 2011-2022 走看看