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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 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\n",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 ****************************************************/

 

以上是关于SDUT 3363 数据结构实验之图论七:驴友计划的主要内容,如果未能解决你的问题,请参考以下文章

SDUT 3364 数据结构实验之图论八:欧拉回路

SDUT-3361_数据结构实验之图论四:迷宫探索

SDUT 3362 数据结构实验之图论六:村村通公路

SDUT 2498 数据结构实验之图论十一:AOE网上的关键路径

SDUT 2142 TEST数据结构实验之图论二:基于邻接表的广度优先搜索遍历

SDUT-2107_图的深度遍历