码迷,mamicode.com
首页 > 其他好文 > 详细

pat1003 迪杰斯特拉法和dfs求最短路

时间:2017-09-26 19:18:51      阅读:227      评论:0      收藏:0      [点我收藏+]

标签:eof   names   cst   blog   邻接矩阵   res   深度   block   矩阵   

本题的背景是求定点和定点之间的最短路问题,方法手段来自数据结构课程中的迪杰斯特拉算法和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]  不会报错  但会导致输入异常   这个问题我也很奇怪  先在这里记录说明了

 

  •   迪杰斯特拉算法

pat1003 迪杰斯特拉法和dfs求最短路

标签:eof   names   cst   blog   邻接矩阵   res   深度   block   矩阵   

原文地址:http://www.cnblogs.com/mdz-great-world/p/7598108.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!