`

PAT 1003 Emergency

 
阅读更多



 

#include <stdio.h>  

#define N 501

int rescue[N] = {1,2,1,5,3};
int startP,endP;
int res[N] = {0};
int dist[N];//距离值   
int path[N]={0};  
int size=0;
int vex[N][N]={0};  
int visit[N]={0};
int max[N]={0};  

void DFS(int start, int end){   
    int j,i = start;
	
	if(start == end){
		//找到或没找到
		return;
	} else {
		for(j=0;j<size;j++){
			if(vex[i][j] != 0 && visit[j] == 0){
				visit[j] = 1;
//				path[j] = path[i];
				if(dist[j] == dist[i] + vex[i][j]){
					path[j]++;
					res[j] = res[i] + rescue[j];
					if(res[j] > max[j]) {
						max[j] = res[j];
					} else{
						res[j] = max[j];
					}
				}
				if(dist[j] > dist[i] + vex[i][j]){
					dist[j] = dist[i] + vex[i][j];
					path[j] = 1;
					res[j] = res[i] + rescue[j];
					max[j] = res[j];
				}
				DFS(j, end);

				visit[j] = 0;
				//res[end] +=rescue[i];
			}
		}
	}
}  
/*
void init(){ 
    int n,pCount; 
    int i; 
    scanf("%d %d %d %d",&n, &pCount, &startP, &endP); 
    size = n; 
     
    for(i=0;i<n;i++){ 
        scanf("%d", &rescue[i]); 
    } 
 
    int r,c,value; 
     
    for(i=0;i<pCount;i++){ 
        scanf("%d %d %d", &r, &c, &value); 
        vex[r][c] = vex[c][r] = value; 
    }

  	for(i=0;i<N;i++){
		dist[i] = 1000000;
	}
	
	visit[startP] = 1;  
    dist[startP] = 0;  
	path[startP] = 1;
	max[startP] = res[startP] = rescue[startP];

    DFS(startP, endP); 
} 
*/

void init(){  
    int i,n,pCount;
	startP=0;
	endP=4;
    n=5;  
    size = n;  
    pCount=7;  
//  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;  
	
	for(i=0;i<N;i++){
		dist[i] = 1000000;
	}

	visit[startP] = 1;  
    dist[startP] = 0;  
	path[startP] = 1;
	max[startP] = res[startP] = rescue[startP];

    DFS(startP, endP);  
}  

int main(){  
    init();  
	
//  printf("%d", vex[399][499]);  
	printf("%d %d", path[endP], max[endP]);
    return 0;  
}

 两个测试点没过

 

#include <stdio.h>  

#define N 501  
  
int rescue[N];  
int res[N]={0};  
int dist[N]={0};//距离值   
int pred[N]={-1};//前驱   
int path[N]={0};  
int size=0;  
int queue[N+1]={-1};  
int vex[N][N]={0};  
int visit[N]={0};  

void updateRes(int pre){
//	printf("hello1---[%d]\n", pre);
	int i;
	if(pre != -1){
		for(i=0;i<size;i++){
			if(pred[i] == pre && i != pre){
				printf("hello");
				res[i] = res[pre] + rescue[i];
				updateRes(i);
			}
		}
		if(i == size) updateRes(-1);
	} else {
		return;
	}
}

void BFS(int start, int end){  
    //队列头尾指针  
    int front=0,rear=0;  
    queue[++rear]=start;  
    visit[start] = 1;
    dist[start] = 0;
	path[start] = 1;
	res[start] = rescue[start];
    int i,j;  
    while(front!=rear){  
        i = queue[++front];  
        for(j=0;j<size;j++){  
            if(vex[i][j] != 0){  
                if(visit[j] == 0){  
                    queue[++rear] = j;  
                    dist[j] = dist[i] + vex[i][j];  
                    path[j] = path[i];
                    res[j] = res[i] + rescue[j];
                    visit[j] = 1;  
                    pred[j] = i;  
                }else { 
					
                    if(j!=start && j != pred[j]){  
						if(dist[j] == dist[i] + vex[i][j]){
							if(res[j] < res[i] + rescue[j]){
								res[j] = res[i] + rescue[j];
								pred[j] = i;
								updateRes(j);
							}
                            path[j]++;
                        }
                        if(dist[j] > dist[i] + vex[i][j]) {  
                            dist[j] = dist[i] + vex[i][j];  
                            res[j] = res[i] + rescue[j];  
                            pred[j] = i;  
                            path[j] = 1;  
							updateRes(j);
                        }    
                    }  
					
                }  
            }  
        }  
    }  
}  
 
void init(){ 
    int n,pCount,startP,endP; 
    int i; 
    scanf("%d %d %d %d",&n, &pCount, &startP, &endP); 
    size = n; 
     
    for(i=0;i<n;i++){ 
        scanf("%d", &rescue[i]); 
    } 
 
    int r,c,value; 
     
    for(i=0;i<pCount;i++){ 
        scanf("%d %d %d", &r, &c, &value); 
        vex[r][c] = vex[c][r] = value; 
    } 
    BFS(startP, endP); 
	printf("%d %d", path[endP], res[endP]);  
} 
  

void init(){  
    int n,pCount,startP=0,endP=5;  
    int i;  
    n=6;  
    size = n;  
    pCount=6;  
//  rescue[size] = {1,2,1,5,3};  
    int r,c,value;  
    vex[0][1] = vex[1][0] = 1;  
    vex[0][2] = vex[2][0] = 3;  
    vex[2][3] = vex[3][2] = 1;  
    vex[1][2] = vex[2][1] = 1;  
    vex[2][4] = vex[4][2] = 1;  
    vex[4][5] = vex[5][4] = 1;  
  
    BFS(startP, endP);  
	printf("%d %d", path[endP], res[endP]);  
}  
 
int main(){  
    init();  
    return 0;  
}

 四个测试点没过

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 55.3 KB
分享到:
评论

相关推荐

    浙江大学pat题目集合(1001-1080)

    而编号1003的题目——Emergency (25)——则是一个典型的图论问题,涉及到最短路径的计算。在这个问题中,编程者需要模拟一个城市救援任务的场景,通过计算最短路径来调动救援力量。这一类型的题目不仅考察了编程者对...

    浙江大学pat题目集合(1001-1091)

    1003题——Emergency,此题模拟了一个紧急救援团队队长的场景。你需要根据给定的城市地图,找出从当前城市出发到达目标城市最快的路线,并在途中动员尽可能多的救援队伍。输入案例包含了城市之间的连接信息,包括每...

    PAT 题目精解但(包括1000题)

    例如,1003题"Emergency"可能涉及到使用贪心策略来解决问题。解题时,需要从问题描述出发,确定贪心选择的标准,然后构建局部最优解,直至得到全局最优解。 4. Dijkstra算法:在图论和网络流问题中,Dijkstra算法是...

    pat题目分类.docx

    - **最短路径算法** (如1003 Emergency, 1072 Gas Station, 1087 All Roads Lead to Rome, 1030 Travel Plan): 主要涉及Dijkstra算法,需要理解和实现这个经典算法。 - **最大团问题** (1142 Maximal Clique): ...

    浙江大学pat题目集合(1001-1072)

    1003. Emergency(25分): 这道题与图论和最短路径计算相关。模拟了一个城市紧急救援队队长的角色,需要根据地图上的城市和道路信息,找出从出发城市到目标城市的最短路线,并沿途动员最多的救援队伍。输入包含一个...

    PAT甲级题解.pdf

    3. Dijkstra算法:尽管在文件片段中没有详细解释Dijkstra算法,但根据题名"Emergency"(编号1003)可以推测,这个问题可能涉及图论中的单源最短路径问题。Dijkstra算法是一种用于在加权图中找到从单一源点到所有其他...

    pat题集word

    **题1003:Emergency (25)** 这个题目可能是关于路径规划和最优化的问题,模拟紧急救援情况。你可能需要读取一个城市地图的数据,包括各城市之间的连接道路以及救援队伍数量和道路长度。你的任务是在接到紧急呼叫时...

    PAT甲级真题练习1

    PAT甲级真题练习1 PAT(Programming Ability Test)是一种针对程序设计能力的测试,旨在评估程序员的编程能力和解决问题的能力。PAT 甲级真题练习1是其中的一份练习题,共包含15个问题,涵盖了字符串处理、数据结构...

    程序员刷题judge-PAT_Solutions::lollipop:MyPAT(AdvancedLevel)练习解决方案

    Emergency(25 分) 解题思路 先通过 dijkstra 算法求出最短的路径长度,之后从终点回溯 dfs,记录满足:dis[u] + cost(u, v) = dis[v] 的点,生成路径。递归出口:u 是起点。 先用 dijkstra 算法求出最短路,使用 ...

    北师大版高中英语选修7(部分单词表)

    - **例句**:“In case of emergency, please use the nearest exit.”(紧急情况下,请使用最近的出口。) #### dilemma - **含义**:困境;进退两难的窘境 - **例句**:“He faced a dilemma between choosing ...

Global site tag (gtag.js) - Google Analytics