本题的背景是求定点和定点之间的最短路问题(所有的最短路 不是一个解  是全部解,方法手段来自数据结构课程中的迪杰斯特拉算法和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;
}
  1. 容易放的错误是mind,maxr忘记赋初始值    
  2. 矩阵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求最短路的更多相关文章

  1. 算法基础⑧搜索与图论--dijkstra(迪杰斯特拉)算法求单源汇最短路的最短路径

    单源最短路 所有边权都是正数 朴素Dijkstra算法(稠密图) #include<cstdio> #include<cstring> #include<iostream ...

  2. 迪杰斯特拉(Dijkstra) 最短路算法

    直接看B站视频吧: https://www.bilibili.com/video/BV1QK411V7V4/

  3. ACM-ICPC 2018 南京赛区网络预赛 - L Magical Girl Haze (分层迪杰斯特拉)

    题意:N个点,M条带权有向边,求可以免费K条边权值的情况下,从点1到点N的最短路. 分析:K<=10,用dist[i][j]表示从源点出发到点i,免费j条边的最小花费.在迪杰斯特拉的dfs过程中 ...

  4. POJ 2502 Subway(迪杰斯特拉)

    Subway Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6692   Accepted: 2177 Descriptio ...

  5. 单源最短路径-迪杰斯特拉算法(Dijkstra's algorithm)

    Dijkstra's algorithm 迪杰斯特拉算法是目前已知的解决单源最短路径问题的最快算法. 单源(single source)最短路径,就是从一个源点出发,考察它到任意顶点所经过的边的权重之 ...

  6. 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 ...

  7. C++迪杰斯特拉算法求最短路径

    一:算法历史 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以 ...

  8. 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 ...

  9. hdu 1142(迪杰斯特拉+记忆化搜索)

    A Walk Through the Forest Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Jav ...

随机推荐

  1. en-zh(科学技术)science and technology-2

    研究:长期不吃早餐,患心脏病风险增加87% Skipping breakfast could raise risk of heart disease by 87% Skipping breakfast ...

  2. python基础4 input()函数

    input()函数 赋值输出: name=input('请求输入你喜欢的电影名:')print(name+'是我最喜欢的电影!') 输入:大话西游 输出:大话西游是我最喜欢的电影! print('那么 ...

  3. 第一编,漫漫长征路,第一天学习python

    安装之后,出现 api-ms-win-crt-runtimel1-1-0.dll缺失   还在解决中 重装系统后,安装成功 python的种类: javapython cpython pypy

  4. 共享文件 Ubuntu下安装Samba与Windows

    Author:Xianghai Ding.Date:2019/01/08**************************************************************安装 ...

  5. HDU 2544最短路 【dijkstra 链式前向星+优先队列优化】

    最开始学最短路的时候只会用map二维数组存图,那个时候还不知道这就是矩阵存图,也不懂得效率怎么样 经过几个月的历练再回头看最短路的题, 发现图可以用链式前向星来存, 链式前向星的效率是比较高的.对于查 ...

  6. bootstrap 自适应和响应式布局的区别

    自适应:  不管屏幕多大,都尽量不换行,而只是横向缩放. 响应式: 屏幕变小了之后,属于同一行的元素受到挤压后,行的右边元素自动换行显式: 屏幕大了后,本属于同一行的元素尽可能的排在同一行内: boo ...

  7. iOS聊天客服功能(Udesk)

    前言: 在商城或者需要用户和平台交流的APP中需要用到客服功能.接下来会讲解Udesk客服功能的实现.技术文档在Udesk官网可以看到,本文讲述在项目中的集成实现流程.客服使用的PC端交流工具账号在公 ...

  8. 再次聊一聊promise settimeout asycn awiat执行顺序---js执行机制 EVENT LOOP

    首先js是单线程 分为同步和异步,异步又分为(macrotask 宏任务 和 microtask微任务 ), 这图还是很清晰嘛,再来一张 总结一下,就是遇到同步先执行同步,异步的丢到一边依次排队,先排 ...

  9. .htaccess实现php网站伪静态

    伪静态是啥?很简单,就是假的静态网页...例如有个网页是:www.xxx.com/index.php?id=1这是动态网页,php后缀的如果改成:www.xxx.com/index-1.html那么这 ...

  10. 控制台出现“The script has an unsupported MIME type ('text/html')”报错

    有时候开发React或者Vue项目时,本地运行访问时,会莫名出现报错如下: The script has an unsupported MIME type ('text/html') 这是由于无意中开 ...