
#include <stdio.h>
#define N 501
#define M 1000000
int rescue[N];// = {1,2,1,5,3}
int startP,endP;
int path[N]={0};
int size=0;
int vex[N][N]={0};
int visit[N]={0};
int maxR=0;
int minP=M;
int pathcount=1;
int pCount=0;//路径指针
void DFS(int start, int end){
int j,i = start;
if(start == end){
//找到
int t, sumP=0, sumR=0;
for(t=0;t<pCount;t++){
sumP += vex[path[t]][path[t+1]];
sumR += rescue[t];
}
sumR += rescue[pCount];
if(sumP == minP) {
if(sumR > maxR) {
maxR = sumR;
}
pathcount++;
}
if(sumP < minP) {
minP = sumP;
pathcount = 1;
maxR = sumR;
}
return;
} else {
for(j=0;j<size;j++){
if(vex[i][j] != 0 && visit[j] == 0){
visit[j] = 1;
path[++pCount] = j;
DFS(j, end);
path[pCount--] = 0;
visit[j] = 0;
}
}
}
}
void init(){
int n,pCountt;
int i;
scanf("%d %d %d %d",&n, &pCountt, &startP, &endP);
size = n;
for(i=0;i<n;i++){
scanf("%d", &rescue[i]);
}
int r,c,value;
for(i=0;i<pCountt;i++){
scanf("%d %d %d", &r, &c, &value);
vex[r][c] = vex[c][r] = value;
}
visit[startP] = 1;
path[0] = startP;
DFS(startP, endP);
}
/*
void init(){
int i,n,pCount;
startP=0;
endP=4;
n=5;
size = n;
// rescue[size] = {1,2,1,5,3};
vex[0][1] = vex[1][0] = 1;
vex[0][2] = vex[2][0] = 2;
vex[0][3] = vex[3][0] = 1;
vex[1][2] = vex[2][1] = 1;
vex[2][4] = vex[4][2] = 1;
vex[3][4] = vex[4][3] = 2;
visit[startP] = 1;
path[0] = startP;
DFS(startP, endP);
}
*/
int main(){
init();
// printf("%d", vex[399][499]);
printf("%d %d", pathcount, maxR);
return 0;
}
三个测试点没过
本文介绍了一个使用深度优先搜索(DFS)算法寻找从起点到终点的最短路径,并在此基础上求取最大救援资源的C语言程序。该程序定义了顶点间的关系及救援资源分配,通过DFS遍历所有可能的路径,最终输出最短路径及其上获得的最大救援资源总量。

被折叠的 条评论
为什么被折叠?



