pat1003 迪杰斯特拉法和dfs求最短路
本题的背景是求定点和定点之间的最短路问题(所有的最短路 不是一个解 是全部解,方法手段来自数据结构课程中的迪杰斯特拉算法和dfs(深度优先遍历)。
分别用两种方法编程如下代码
- dfs
- #include <iostream>
- #include <cstring>
- #include <cstdio>
- using namespace std;
- #define maxv 510
- bool visit[maxv];
- int arc[maxv][maxv];//邻接矩阵
- int M,N,C1,C2; //M总顶点数,N总边数,C1起点,C2终点
- int vex[maxv]; //记录每个顶点的救援人数
- int mind=0xfffffff,maxr=0,cnt;//mind最短路径,maxr最大救援人数,cnt最短路径条数
- void dfs(int st,int end,int curPath,int curRes){
- if (st==end){
- if (curPath<mind){
- cnt=1;
- mind=curPath;
- maxr=curRes;
- }else if(curPath==mind){
- cnt++;
- if (curRes>maxr)
- maxr=curRes;
- }
- return;
- }
- else{
- for (int k=0;k<M;k++){
- if (arc[st][k]!=0&&!visit[k]){
- visit[k]=1;
- dfs(k,end,curPath+arc[st][k],curRes+vex[k]);
- visit[k]=0;
- }
- }
- return ;
- }
- }
- int main(){
- while(scanf("%d%d%d%d",&M,&N,&C1,&C2)!=EOF){
- memset(arc,0,sizeof(arc));
- for(int i=0;i<M;i++)
- scanf("%d",&vex[i]);
- int i,j,d;
- for(int k=0;k<N;k++){
- scanf("%d%d%d",&i,&j,&d);
- arc[j][i]=arc[i][j]=d;
- }
- memset(visit,0,sizeof(visit));
- visit[C1]=1;
- dfs(C1,C2,0,vex[C1]);
- printf("%d %d",cnt,maxr);
- }
- return 0;
- }
- 容易放的错误是mind,maxr忘记赋初始值
- 矩阵scanf输入的时候&arg[i][j] 不会报错 但会导致输入异常 这个问题我也很奇怪 先在这里记录说明了
- 迪杰斯特拉算法
- #include <iostream>
- #include <cstdio>
- using namespace std;
- #define maxv 510
- #define inf 65536
- int arc[maxv][maxv];//邻接矩阵
- int M,N,C1,C2; //M总顶点数,N总边数,C1起点,C2终点
- int vex[maxv]; //记录每个顶点的救援人数
- int maxr=0,cnt;//mind最短路径,maxr最大救援人数,cnt最短路径条数
- int Path[maxv],D[maxv],S[maxv];
- //Path[]记录从源点v0到终点vi的直接前驱顶点序号
- //D[]记录从源点v0到终点vi的当前最短路径长度
- //S[]记录从源点v0到源点vi是否已经被确定最短路径长度
- /*计算v0到j的当前最大救援人数*/
- void compute(int v0,int j){
- int curRes=vex[v0];
- for (int k=j;k!=v0;k=Path[k]){
- curRes+=vex[k];
- }
- if (curRes>maxr)
- maxr=curRes;
- return;
- }
- void dijistra(int v0,int v){
- int mind,w;
- //mind最短路径 w被加入到S中的顶点序号
- int curRes=0;
- /*初始化*/
- for (int i=0;i<M;i++){
- S[i]=false;
- D[i]=arc[v0][i];
- if (D[i]<inf)
- Path[i]=v0;
- else
- Path[i]=-1;
- }
- cnt=1;
- compute(v0,v);
- S[v0]=true;
- D[v0]=0;
- /*v0到其他M-1个顶点的最短路径*/
- for (int i=1;i<M;i++){
- mind=inf;
- for (int j=0;j<M;j++)
- if (!S[j]&&D[j]<mind){
- w=j;mind=D[j];
- }
- S[w]=true;
- for (int j=0;j<M;j++)
- if (!S[j]&&(D[w]+arc[w][j]<D[j])){
- D[j]=D[w]+arc[w][j];
- Path[j]=w;
- if (j==v){
- cnt=1;
- maxr=0;
- compute(v0,j);
- }
- }else if (!S[j]&&D[w]+arc[w][j]==D[j]){
- Path[j]=w;
- if (j==v){
- cnt++;/*v0到顶点j的当前最短路径不止一条*/
- compute(v0,j);
- }
- }
- }
- return;
- }
- int main(){
- while(scanf("%d%d%d%d",&M,&N,&C1,&C2)!=EOF){
- for (int i=0;i<M;i++)
- for (int j=0;j<M;j++)
- arc[i][j]=inf;
- for(int i=0;i<M;i++)
- scanf("%d",&vex[i]);
- int i,j,d;
- for(int k=0;k<N;k++){
- scanf("%d%d%d",&i,&j,&d);
- arc[j][i]=arc[i][j]=d;
- }
- dijistra(C1,C2);
- printf("%d %d\n",cnt,maxr);
- //printf("%d %d %d %d %d\n",cnt,maxr,D[C2],Path[C2],Path[Path[C2]]);
- /*for (int i=0;i<M;i++){
- for (int j=0;j<M;j++)
- printf("%d ",arc[i][j]);
- printf("\n");
- }*/
- }
- return 0;
- }
这段代码目前只能通过pat平台的三个测试样例 得 16分 后续会 改bug
pat1003 迪杰斯特拉法和dfs求最短路的更多相关文章
- 算法基础⑧搜索与图论--dijkstra(迪杰斯特拉)算法求单源汇最短路的最短路径
单源最短路 所有边权都是正数 朴素Dijkstra算法(稠密图) #include<cstdio> #include<cstring> #include<iostream ...
- 迪杰斯特拉(Dijkstra) 最短路算法
直接看B站视频吧: https://www.bilibili.com/video/BV1QK411V7V4/
- ACM-ICPC 2018 南京赛区网络预赛 - L Magical Girl Haze (分层迪杰斯特拉)
题意:N个点,M条带权有向边,求可以免费K条边权值的情况下,从点1到点N的最短路. 分析:K<=10,用dist[i][j]表示从源点出发到点i,免费j条边的最小花费.在迪杰斯特拉的dfs过程中 ...
- POJ 2502 Subway(迪杰斯特拉)
Subway Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6692 Accepted: 2177 Descriptio ...
- 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)
Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...
- PAT 1087 All Roads Lead to Rome[图论][迪杰斯特拉+dfs]
1087 All Roads Lead to Rome (30)(30 分) Indeed there are many different tourist routes from our city ...
- C++迪杰斯特拉算法求最短路径
一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...
- hdu 1595 find the longest of the shortest(迪杰斯特拉,减去一条边,求最大最短路)
find the longest of the shortest Time Limit: 1000/5000 MS (Java/Others) Memory Limit: 32768/32768 ...
- hdu 1142(迪杰斯特拉+记忆化搜索)
A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Jav ...
随机推荐
- 2018-2019-2 20165336 《网络对抗技术》 Exp6 信息搜集与漏洞扫描
2018-2019-2 20165336 <网络对抗技术> Exp6 信息搜集与漏洞扫描 一.原理与实践说明 1.实践内容 本实践的目标是掌握信息搜集的最基础技能.具体有: 各种搜索技巧的 ...
- DetNet: A Backbone network for Object Detection 笔记
1 前言 主要贡献: (1)第一个分析微调传统ImageNet预训练模型应用于目标检测器的固有缺点 (2)提出一个名为DetNet的新的骨干结构,它通过保持空间分辨率和扩大感受野的方式来专门设计用于目 ...
- python集合set相关操作
定义: 1.不同元素组成 2.无序 3.集合中的元素必须是不可变类型 创建集合 1 s = {1,2,3,4,5,6,7,8} 1.定义可变集合 1 2 3 >>> set_test ...
- 《linux就该这么学》第十七节课:第18,19,23章,mariadb数据库、PXE无人值守安装系统和openldap目录服务。
第23章 (借鉴请改动) openldap数据的特点:1.短小.2.读取次数较多 上述说明: openLDAP服务端配置: 1.yum install -y openldap openldap ...
- python数据类型之列表类型
一.列表 作用:多个装备,多个爱好,多门课程,多个女朋友等 定义:[]内可以有多个任意类型的值,逗号分隔 以下是列表的常用操作方法: append(), count(), insert(),rever ...
- 自定义Win10右键“发送到”菜单
打开Win10文件资源管理器窗口(打开“这台电脑”或任一文件夹即可),然后在资源管理器窗口的地址栏中输入 shell:sendto ,回车或点击地址栏右侧的“转到”箭头即可打开“SendTo(发送到) ...
- 学Python的感受
这门课程已经上了两周了,虽然还没学到什么实质上的东西,只是做了几道题,但是我也感受到了Python的魅力.我感觉这门课真的很有用,比如老师所说的网络爬虫,我对这个非常感兴趣.再说说老师的教学方式,理论 ...
- arm浮点运算
首先总结一下计算机中的浮点数的存储. 浮点数的标准是IEEE-754,规定了浮点数的存储都是通过科学计算法来存储的,n2-e的表示. 浮点数首先分为,定浮点(fixed-point)和浮点(float ...
- linux目录详细列表
详细列表 目录 说明 备注 bin 存放普通用户可执行的指令 即使在单用户模式下也能够执行处理 boot 开机引导目录 包括Linux内核文件与开机所需要的文件 dev 设备目录 所有的硬件设备及周边 ...
- Qt3D Shader
--------------------------------------------------- Qt3D ShaderPrograme Qt3D GLSL 渲染器 Shader示例可参考: h ...