首页 > 代码库 > SDUT 3363 数据结构实验之图论七:驴友计划

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

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

Time Limit: 1000MS Memory Limit: 65536KB
Submit Statistic

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 数据结构实验之图论七:驴友计划