PAT 1003 Emergency 递归记录访问路径

本文介绍了一个使用深度优先搜索(DFS)算法寻找从起点到终点的最短路径,并在此基础上求取最大救援资源的C语言程序。该程序定义了顶点间的关系及救援资源分配,通过DFS遍历所有可能的路径,最终输出最短路径及其上获得的最大救援资源总量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



 

 

#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;  
}

 三个测试点没过

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值