本题翻译:
题目给出四个数字,分别是N(多少城市)、M(有几条路)、C1(初始城市)、C2(救援城市)
第二行是给出五个城市分别有多少救援人员。
接下来的N行是城市x,城市y,两个城市的距离。
最后求到该城市的最短距离有几条路,在最短距离的情况下最多的救援人员是多少?
本题思路:
利用深度搜索进行图的遍历,寻找最短路径,顺带把救援人员进行统计。
详细代码样例:
//pat1003 深度优先搜索, 要求获得城市有路的连接 2.23 就刷这一道题 把思路捋清楚之后自己再写一遍 //给出四个数字 分别是 城市数量 路的条数 初始城市 救助城市 //每一行给出城市的人数 和距离、 //深度搜索 找最短的路 记录人数,在最短路的前提下 找最多的人数 #includeusing namespace std; vector v [500];//v[1]=2说明1号城市有2号城市的路 int path;//记录到达C2有几条路 int teams; int num_of_team[500],dis[500][500];//每个城市救援人数 记录到达该点的最短距离 记录两个城市是否有路 int mindis[500] ;//在没有到之前默认每座城市两端都无穷大 int N,M,C1,C2;//城市数量 路的条数 初始城市 救助城市 void dfs(int curity,int curlen,int curteam){ if(curlen>mindis[curity]) return;//如果走了的距离比我上次走的距离还远,就及时止损;说明有两条路都可以走到这个地,选择最短的路,在回溯当中属于是终止条件 if(curity==C2){//说明已经到达了目的地,这个时候就需要开始判断这条路是不是最近的 if(curlen==mindis[curity]) { path++;//说明有两条路 if(curteam>teams){//判断当前的救援人员和之前的救援人员哪个多 当前多就把当前人员赋值过去 只记录到达C2的救援人数去比较 teams=curteam; } } else{//否则就把path赋值为1,说明虽然两条一样的路到达 但是只有一条路人数最少 path=1; mindis[C2]=curlen;//更新该点的距离 teams=curteam;//团队更新 到时候要输出的 } } else{ if(curlen >N>>M>>C1>>C2; for(int i=0;i >num_of_team[i];//把每座城市的人存进去 } for(int i=0;i >a>>b>>c; v[a].emplace_back(b); v[b].emplace_back(a); dis[a][b]=dis[b][a]=c;//a,b城市互通的距离为c } //从初始城市找目标城市,一个一个遍历,找到最短距离 利用深搜 for(int i=0;i
本题难度还比较大,需要熟练掌握深搜,感谢b站的up主弄夫,太厉害啦!
up主的视频指路视频指路



