//数据第一行:N 城市数量 M道路数量 C1 C2
//数据第二行:每个城市的救援队数量
//数据第三行:城市C1 C2, L(道路长度)
#include<iostream>
#include<vector> //vector容器
using namespace std;
int N, M, C1, C2; //N是城市数量(500) M是道路数量 C1-C2表示两个城市
int num_of_team[500]; //该数组用于存放每个城市的救援队数量
int dis[500][500]; //该数组用于存放城市之间的距离
vector<int>v[500]; //该容器用于存放每个城市的邻居
int mindis[500]; //记录最短路径
int paths, teams; //paths表示并列最短的路径数,teams表示最多能召集的队员
void dfs(int curcity, int curlen, int curteam) //dfs是深度优先遍历,curcity目前所在城市,curlen总路程,curteam召集的总team
{
if (curlen > mindis[curcity])return; //如果走的距离大于之前记录的最短路径长度直接退出
if (curcity == C2) { //到达了目的地
if (curlen == mindis[curcity])
{ //该条路径长度与最短路径长度相同
paths++;
if (curteam > teams)teams = curteam;
}
else
{ //curlen比之前的最短路径更短
mindis[C2] = curlen;
paths = 1;
teams = curteam;
}
}
else
{ //未到达目的地
if (curlen < mindis[curcity])mindis[curcity] = curlen; //如果目前的距离比最短距离短则更新curlen
for (int i = 0; i < v[curcity].size(); i++)
{
int j = v[curcity][i];
dfs(j, curlen + dis[curcity][j], curteam + num_of_team[j]);
}
}
}
int main()
{
int i, j, k, l;
cin >> N >> M >> C1 >> C2;
for (i = 0; i < N; i++)cin >> num_of_team[i]; //输入每个城市的救援队数量
for (i = 0; i < M; i++)
{
cin >> j >> k >> l; //输入城市j 城市k 两个城市的距离l
v[j].emplace_back(k); //给j添加邻居k
v[k].emplace_back(j); //给k添加邻居j
dis[j][k] = dis[k][j] = l;
}
for (i = 0; i < N; i++)mindis[i] = 100000000; //记录最短路径
dfs(C1, 0, num_of_team[C1]); //初始城市,初始距离,初始team数
cout << paths << " " << teams;
}
PAT甲级——1003
最新推荐文章于 2023-11-06 17:38:02 发布