// 深度优先搜索
#include<iostream>
#include<vector>
#include<limits.h>
using namespace std;
int N, M, C1, C2;// 城市数,路数,起始城市,结束城市
int teamNum[500];// 每个城市救援队数量
vector<int> vec[500]; // 城市i的第t个相邻城市是vec[i][t]
int dis[500][500]; //城市i到城市j的距离
int minDis[500]; // 到城市i的最短距离
int pathNum, teamn;
void dfs(int curCity, int curLen, int curTeam){
/*深度优先搜索
curCity:当前城市 curLen:当前最短路径 curTeam:当前救援队总数
*/
//当前已走过的距离大于最短路径
if(curLen > minDis[curCity]) return;
//当前已到达C2城市
if(curCity == C2){
if(curLen == minDis[curCity]){//当前走过距离和mindis相等,即多了一条最短路径
pathNum++;
if(curTeam > teamn) teamn = curTeam; //若当前救援队数量更大,更新救援队数量
}else{
//当前走过的距离小于最短路径,直接更新最短路径数和救援队数目
minDis[curCity] = curLen;
pathNum = 1;
teamn = curTeam;
}
}else{ //当前在其他城市
// 判断是否需要更新最小距离
if(curLen < minDis[curCity]) minDis[curCity] = curLen;
for(int i=0; i<(int)vec[curCity].size(); i++){
int adjoinCity = vec[curCity][i]; // curCity的相邻城市
// 遍历curCity的相邻城市
dfs(adjoinCity, curLen+dis[curCity][adjoinCity], curTeam+teamNum[adjoinCity]);
}
}
}
int main(){
int pos;
int i, j, len; //城市i和城市j的路长度为len
cin >> N >> M >> C1 >> C2;
for(int pos=0; pos<N; pos++) cin >> teamNum[pos];
for(int pos=0; pos<M; pos++){
cin >> i >> j >> len;
vec[i].emplace_back(j);
vec[j].emplace_back(i);
dis[i][j] = dis[j][i] = len;
}
for(int pos=0; pos<N; pos++) minDis[pos] = INT_MAX;
dfs(C1, 0, teamNum[C1]);
cout << pathNum << " " << teamn;
return 0;
}
示例代码
#include<iostream>
#include<vector>
using namespace std;
int nodeNum, nlNodeNum; // 总结点数,非叶子的结点数
vector<int> childs[100]; // i结点的第j个子结点id为 childs[i][j]
int leafNum[100] = {0}, maxLevel; // 第i层的叶子结点数为leafNum[i] 最大层数maxLevel
void DFS(int curId, int curLevel){
// curId:当前遍历的结点id curLevel:当前遍历所在的层级,最上面为0层
int childNum = childs[curId].size();
// 若当前层级更大,更新maxLevel
if(curLevel > maxLevel) maxLevel = curLevel;
if(childNum==0){
// 当前结点没有子结点
leafNum[curLevel]++; //更新当前层的叶子结点数
return;
}else{
// 当前结点有子结点,遍历他的子结点(下一层级)
for(int i=0; i<childs[curId].size(); i++){
DFS(childs[curId][i], curLevel+1);
}
}
}
int main(){
int pos, i;
cin >> nodeNum >> nlNodeNum;
for(pos=0; pos<nlNodeNum; pos++){
int id, childNum;
cin >> id >> childNum;
for(i=0; i<childNum; i++){
int childId;
cin >> childId;
childs[id].emplace_back(childId);
}
}
**自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。**
**深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!**
**因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。**






**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)**
csdnimg.cn/img_convert/9f49b566129f47b8a67243c1008edf79.png)
**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!**
**由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新**
**如果你觉得这些内容对你有帮助,可以扫码获取!!!(备注:Python)**
