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 ****************************************************/
时间: 2024-11-04 23:42:56

SDUT 3363 数据结构实验之图论七:驴友计划的相关文章

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

数据结构实验之图论八:欧拉回路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 在哥尼斯堡的一个公园里,有七座桥将普雷格尔河中两个岛及岛与河岸连接起来. 能否走过这样的七座桥,并且每桥只走一次?瑞士数学家欧拉最终解决了这个问题并由此创立了拓扑学.欧拉通过对七桥问题的研究,不仅圆满地回答了哥尼斯堡七桥问题,并证明了更为广泛的有关一笔画的三条结论,人们通常称之为欧拉定理.对于一个连通图,通常把

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

数据结构实验之图论四:迷宫探索 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 有一个地下迷宫,它的通道都是直的,而通道所有交叉点(包括通道的端点)上都有一盏灯和一个开关:请问如何从某个起点开始在迷宫中点亮所有的灯并回到起点? Input 连续T组数据输入,每组数据第一行给出三个正整数,分别表示地下迷宫的结点数N(1 < N <= 1000).边数M(M <= 30

SDUT 3346 数据结构实验之二叉树七:叶子问题

数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按先序输入的字符序列,如abd,,eg,,,cf,,,(其中,表示空结点).请建立该二叉树并按从上到下从左到右的顺序输出该二叉树的所有叶子结点. Input 输入数据有多行,每一行是一个长度小于50个字符的字符串. Output 按从上到下从左到右的顺序输出二叉树的叶子结点. Example Inpu

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

数据结构实验之图论六:村村通公路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 当前农村公路建设正如火如荼的展开,某乡镇政府决定实现村村通公路,工程师现有各个村落之间的原始道路统计数据表,表中列出了各村之间可以建设公路的若干条道路的成本,你的任务是根据给出的数据表,求使得每个村都有公路连通所需要的最低成本. Input 连续多组数据输入,每组数据包括村落数目N(N <= 1000)和可供

SDUT 3404 数据结构实验之排序七:选课名单.!?

数据结构实验之排序七:选课名单 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 随着学校规模的扩大,学生人数急剧增加,选课名单的输出也成为一个繁重的任务,我校目前有在校生3万多名,两千多门课程,请根据给定的学生选课清单输出每门课的选课学生名单. Input 输入第一行给出两个正整数N( N ≤ 35000)和M(M ≤ 2000),其中N是全校学生总数,M是课程总数,随后给出N行,每行包括

SDUT 3379 数据结构实验之查找七:线性之哈希表

数据结构实验之查找七:线性之哈希表 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 根据给定的一系列整数关键字和素数p,用除留余数法定义hash函数H(Key)=Key%p,将关键字映射到长度为p的哈希表中,用线性探测法解决冲突.重复关键字放在hash表中的同一位置. Input 连续输入多组数据,每组输入数据第一行为两个正整数N(N <= 1000)和p(p >= N的最小素数),N是

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

数据结构实验之图论十一:AOE网上的关键路径 Time Limit: 2000 ms Memory Limit: 65536 KiB Problem Description 一个无环的有向图称为无环图(Directed Acyclic Graph),简称DAG图.    AOE(Activity On Edge)网:顾名思义,用边表示活动的网,当然它也是DAG.与AOV不同,活动都表示在了边上,如下图所示:                                         如上所示

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

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) Input 输入第一行为整数n(0< n <100),表示数据的组数.对于每组数据,第一行是三个整数k,m,t(0<

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

数据结构实验之图论二:基于邻接表的广度优先搜索遍历 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个无向连通图,顶点编号从0到n-1,用广度优先搜索(BFS)遍历,输出从某个顶点出发的遍历序列.(同一个结点的同层邻接点,节点编号小的优先遍历) 输入 输入第一行为整数n(0< n <100),表示数据的组数. 对于每组数据,第一行是三个整数k,m,t(0<k<100,0<m<(k-1)*k/2,