#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; }
四个测试点没过
相关推荐
而编号1003的题目——Emergency (25)——则是一个典型的图论问题,涉及到最短路径的计算。在这个问题中,编程者需要模拟一个城市救援任务的场景,通过计算最短路径来调动救援力量。这一类型的题目不仅考察了编程者对...
1003题——Emergency,此题模拟了一个紧急救援团队队长的场景。你需要根据给定的城市地图,找出从当前城市出发到达目标城市最快的路线,并在途中动员尽可能多的救援队伍。输入案例包含了城市之间的连接信息,包括每...
例如,1003题"Emergency"可能涉及到使用贪心策略来解决问题。解题时,需要从问题描述出发,确定贪心选择的标准,然后构建局部最优解,直至得到全局最优解。 4. Dijkstra算法:在图论和网络流问题中,Dijkstra算法是...
- **最短路径算法** (如1003 Emergency, 1072 Gas Station, 1087 All Roads Lead to Rome, 1030 Travel Plan): 主要涉及Dijkstra算法,需要理解和实现这个经典算法。 - **最大团问题** (1142 Maximal Clique): ...
1003. Emergency(25分): 这道题与图论和最短路径计算相关。模拟了一个城市紧急救援队队长的角色,需要根据地图上的城市和道路信息,找出从出发城市到目标城市的最短路线,并沿途动员最多的救援队伍。输入包含一个...
3. Dijkstra算法:尽管在文件片段中没有详细解释Dijkstra算法,但根据题名"Emergency"(编号1003)可以推测,这个问题可能涉及图论中的单源最短路径问题。Dijkstra算法是一种用于在加权图中找到从单一源点到所有其他...
**题1003:Emergency (25)** 这个题目可能是关于路径规划和最优化的问题,模拟紧急救援情况。你可能需要读取一个城市地图的数据,包括各城市之间的连接道路以及救援队伍数量和道路长度。你的任务是在接到紧急呼叫时...
PAT甲级真题练习1 PAT(Programming Ability Test)是一种针对程序设计能力的测试,旨在评估程序员的编程能力和解决问题的能力。PAT 甲级真题练习1是其中的一份练习题,共包含15个问题,涵盖了字符串处理、数据结构...
Emergency(25 分) 解题思路 先通过 dijkstra 算法求出最短的路径长度,之后从终点回溯 dfs,记录满足:dis[u] + cost(u, v) = dis[v] 的点,生成路径。递归出口:u 是起点。 先用 dijkstra 算法求出最短路,使用 ...
- **例句**:“In case of emergency, please use the nearest exit.”(紧急情况下,请使用最近的出口。) #### dilemma - **含义**:困境;进退两难的窘境 - **例句**:“He faced a dilemma between choosing ...