标签:eof names cst blog 邻接矩阵 res 深度 block 矩阵
本题的背景是求定点和定点之间的最短路问题,方法手段来自数据结构课程中的迪杰斯特拉算法和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] 不会报错 但会导致输入异常 这个问题我也很奇怪 先在这里记录说明了
标签:eof names cst blog 邻接矩阵 res 深度 block 矩阵
原文地址:http://www.cnblogs.com/mdz-great-world/p/7598108.html