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

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:

解法一(推荐):迪杰斯特拉算法,在双权无向图中做小修改即可。
 
 #include <iostream>
#include <cstdio>
#include <climits> using namespace std; #define MVN 510 typedef struct AdjMatrix
{
int w; //距离
int m; //费用
char *info;
}AM; typedef struct MGraph
{
int vex[MVN];
AM arc[MVN][MVN];
int vexn,arcn;
int s,e; //起点,终点(编号-下标)
}MG; void creat(MG &G)
{
int i,j,w,m,k;
for(i=;i<G.vexn;i++)
for(j=;j<G.vexn;j++)
{
G.arc[i][j].w=INT_MAX;
G.arc[i][j].m=;
}
for(k=;k<G.arcn;k++)
{
scanf("%d %d %d %d",&i,&j,&w,&m);
G.arc[i][j].w=G.arc[j][i].w=w;
G.arc[i][j].m=G.arc[j][i].m=m;
}
} struct{int w,m;}D[MVN]; //辅助数组{当前最短距离和,当前费用和}
void short_p(MG &G)
{
bool f[MVN]={false}; //是否锁定为最短路径
int i,j,k,min;
//初始化辅助数组并锁定起点
for(k=;k<G.vexn;k++)
{
D[k].w=G.arc[G.s][k].w;
D[k].m=G.arc[G.s][k].m;
}
f[G.s]=true;
//选择并锁定下一最短路径顶点
for(k=;k<G.vexn;k++)
{
min=INT_MAX;
for(j=;j<G.vexn;j++)
if(!f[j])
if(D[j].w<min)
{
i=j;
min=D[j].w;
}
f[i]=true;
//更新该顶点的邻接点的最短路
for(j=;j<G.vexn;j++)
if(!f[j]&&G.arc[i][j].w<INT_MAX)
if(min+G.arc[i][j].w<D[j].w)
{
D[j].w=min+G.arc[i][j].w;
D[j].m=D[i].m+G.arc[i][j].m;
}
else if(min+G.arc[i][j].w==D[j].w && D[i].m+G.arc[i][j].m<D[j].m) //距离相同时选择费用更少
D[j].m=D[i].m+G.arc[i][j].m;
}
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
MG G;
scanf("%d %d %d %d",&G.vexn,&G.arcn,&G.s,&G.e);
creat(G);
short_p(G);
printf("%d %d\n",D[G.e].w,D[G.e].m);
}
return ;
} /***************************************************
User name: ***
Result: Accepted
Take time: 0ms
Take Memory: 176KB
Submit time: 2016-11-17 18:23:42
****************************************************/

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

 
 #include <iostream>
#include <cstdio>
#include <climits> using namespace std; #define MVN 550 typedef struct AdjMatrix
{
int w;
int m;
char *info;
}AM; typedef struct MGraph
{
int vex[MVN];
AM arc[MVN][MVN];
int vexnum,arcnum;
int s,d;
int w,m;
int minw,minm;
}MG; void creat(MG &G)
{
int i,j,w,m,k;
for(k=;k<G.vexnum;k++)
G.vex[k]=k;
for(k=;k<G.arcnum;k++)
{
scanf("%d %d %d %d",&i,&j,&w,&m);
G.arc[i][j].w=w;
G.arc[i][j].m=m;
G.arc[j][i].w=w;
G.arc[j][i].m=m;
}
} void DFS(MG &G,bool *visited,int i)
{
visited[i]=true;
if(i==G.d)
{
if(G.w<G.minw || G.w==G.minw && G.m<G.minm)
{
G.minw=G.w;
G.minm=G.m;
}
}
else
{
int k;
for(k=;k<G.vexnum;k++)
{
if(G.arc[i][k].w<INT_MAX&&visited[k]==false)
{
G.w+=G.arc[i][k].w;
G.m+=G.arc[i][k].m;
DFS(G,visited,k); visited[k]=false; //※探索不同路径后的回退操作※
G.w-=G.arc[i][k].w;
G.m-=G.arc[i][k].m;
}
}
}
} int main()
{
int t;
scanf("%d",&t);
while(t--)
{
MG G={};
scanf("%d %d %d %d",&G.vexnum,&G.arcnum,&G.s,&G.d);
int k,o;
for(k=;k<G.vexnum;k++)
{
for(o=;o<G.vexnum;o++)
G.arc[k][o].w=INT_MAX;
}//初始化邻接矩阵
creat(G);
bool visited[MVN]={false};
G.minm=INT_MAX; //初始化一个最大值
G.minw=INT_MAX;
DFS(G,visited,G.s);
printf("%d %d\n",G.minw,G.minm);
}
return ;
} /***************************************************
User name: ***
Result: Accepted
Take time: 0ms
Take Memory: 2832KB
Submit time: 2016-11-09 22:46:01
****************************************************/

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

  1. 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )

    数据结构实验之图论七:驴友计划 Time Limit: 1000 ms           Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...

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

    数据结构实验之图论八:欧拉回路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

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

    数据结构实验之图论八:欧拉回路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 在哥尼斯堡的 ...

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

    数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...

  5. SDUT OJ 数据结构实验之图论十:判断给定图是否存在合法拓扑序列

    数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Prob ...

  6. SDUT OJ 数据结构实验之图论六:村村通公路(最小生成树)

    数据结构实验之图论六:村村通公路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

  7. SDUT OJ 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)

    数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss P ...

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

    数据结构实验之图论四:迷宫探索 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...

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

    数据结构实验之二叉树七:叶子问题 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...

随机推荐

  1. 详解linux互斥锁 pthread_mutex和条件变量pthread_cond

    [cpp] view plaincopy ============================================================= int pthread_creat ...

  2. python并发编程的几种方法

    1.多线程 Threading模块 2.2.6版本以后 多进程 multiprocessing模块 3.协程 gevent (是一个基于libev的并发库.它为各种并发和网络相关的任务提供了整洁的AP ...

  3. STL空间配置器解析和实现

    STL空间配置器的强大和借鉴作用不言而喻,查阅资料,发现了Dawn_sf已经对其有了极其深入和详细的描述,所以决定偷下懒借用其内容,只提供自己实现STL空间配置器的源码,具体解析内容参考:(一)STL ...

  4. mysql笔记1—安装、配置和基础的数据表操作

    本篇笔记主要分为两部分: 1,安装完毕之后的简单配置 2,数据的类型.简单的数据表操作命令 一.mysql安装完毕之后 windows和linux环境,除mysql的安装.配置有所不同,其他操作一样, ...

  5. java 守护线程整理

    java中finally语句不走的可能存在system.exit(0)与守护线程 线程sleep采用TimeUnit类 设定线程的名字thread.getcurrentThread().setName ...

  6. 基于JQ的三级联动菜单选择

    <!-- author:青芒 --> <!DOCTYPE html> <html lang="en"> <head> <met ...

  7. JSF拦截ajax请求并传递参数方法

    我们可以利用f:ajax做一些简单的ajax操作,但是遇到复杂的逻辑,它不能简单的去实现,jsf提供了一种方法,可以调用它内部的js方法去实现复杂的逻辑. 首先要在页面引入jsf的js文件: < ...

  8. [转载]将网卡(设备中断)绑定到特定CPU

    在前阵子看到HelloDB的一篇文章“MySQL单机多实例方案”中提到: 因为单机运行多个实例,必须对网络进行优化,我们通过多个的IP的方式,将多个MySQL实例绑定在不同的网卡上,从而提高整体的网络 ...

  9. 机器学习:PCA(高维数据映射为低维数据 封装&调用)

    一.基础理解 1) PCA 降维的基本原理 寻找另外一个坐标系,新坐标系中的坐标轴以此表示原来样本的重要程度,也就是主成分:取出前 k 个主成分,将数据映射到这 k 个坐标轴上,获得一个低维的数据集. ...

  10. ZOJ 4016 Mergeable Stack(栈的数组实现)

    Mergeable Stack Time Limit: 2 Seconds      Memory Limit: 65536 KB Given  initially empty stacks, the ...