SDUT 3363 数据结构实验之图论七:驴友计划
数据结构实验之图论七:驴友计划
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 数据结构实验之图论七:驴友计划的更多相关文章
- 数据结构实验之图论七:驴友计划 ( 最短路径 Dijkstra 算法 )
数据结构实验之图论七:驴友计划 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- SDUT OJ 数据结构实验之图论八:欧拉回路
数据结构实验之图论八:欧拉回路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
- SDUT 3364 数据结构实验之图论八:欧拉回路
数据结构实验之图论八:欧拉回路 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 在哥尼斯堡的 ...
- SDUT 3346 数据结构实验之二叉树七:叶子问题
数据结构实验之二叉树七:叶子问题 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Problem Description 已知一个按 ...
- SDUT OJ 数据结构实验之图论十:判断给定图是否存在合法拓扑序列
数据结构实验之图论十:判断给定图是否存在合法拓扑序列 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Prob ...
- SDUT OJ 数据结构实验之图论六:村村通公路(最小生成树)
数据结构实验之图论六:村村通公路 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...
- SDUT OJ 数据结构实验之图论五:从起始点到目标点的最短步数(BFS)
数据结构实验之图论五:从起始点到目标点的最短步数(BFS) Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss P ...
- SDUT OJ 数据结构实验之图论四:迷宫探索
数据结构实验之图论四:迷宫探索 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descrip ...
- SDUT OJ 数据结构实验之二叉树七:叶子问题
数据结构实验之二叉树七:叶子问题 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem Descri ...
随机推荐
- linux shell 学习笔记--内部命令学习
.基本命令 新手必须要掌握的初级命令 ls 基本的列出所有文件的命令.但是往往就是因为这个命令太简单,所以我们总是低估它.比如 ,用 -R 选项,这是递归选项,ls 将会以目录树的形式列出所有文件, ...
- @media screen页面自适应尺寸!!
@media screen and (max-width:360px){body,input,select{font-size:38%}} @media screen and (min-width:3 ...
- HNOI2004 宠物收养所 (平衡二叉树)
题目链接 平衡树基础题,用于测试各种平衡树的性能(雾) treap: #include<bits/stdc++.h> typedef long long ll; using namespa ...
- 【java规则引擎】之Drools引擎中模拟ReteooStatefulSession内部设计结构
该片文章只是抽取drools中java代码实现的一些代码结构,帮助我们理解drools是如何实现rete算法的. 该部分只是抽取ReteooStatefulSession工作过程中的代码架构 利用了多 ...
- webpack 插件
插件可以完成更多 loader 不能完成的功能. 插件的使用一般是在 webpack 的配置信息 plugins 选项中指定. Webpack 本身内置了一些常用的插件,还可以通过 npm 安装第三方 ...
- Python函数-abs()
说明: 返回绝对值 参数可以是:负数.正数.浮点数或者长整形 实例: abs(-1.2) #返回 1.2 abs(1.2) #返回 1.2 abs(-11216.5) #返回 11216.5 abs( ...
- 设置Qt应用程序图标及应用程序名 【转载】
一直以来很纠结给qt应用程序添加图标问题,在网上收过一次,但是感觉不够完整,现将自己的实现过程记录下,以便以后查看: 通过网上的例子知道qt助手中有相关说明: Setting the Applicat ...
- laravel 判断上传文件的类型和后缀
学习源头: https://blog.csdn.net/ddjjll8877/article/details/52249965 class FileUpdateController extends B ...
- DataX实现oracle到oracle之间的数据传递
首先需要注意的是DATAX是通过JDBC的方式读取ORACLE数据,然后通过OCI的方式写数据,DX也可以通过JDBC写的方式进行,但是OCI比JDBC速度更快. 进入DataX安装目录的bin目 ...
- ORACLE显式授权
同一数据库 两个不同用户 user1 user2 user1里面有一张表 table1 在user2里面创建synonymcreate synonym sy1 for user1.table1; 创建 ...