Note:
一开始dfs打算用两个参数,一个city表示当前访问的城市,一个from表示从哪个城市来的,来防止dfs在两个城市之间循环。但如果碰到了三个城市成环的情况,这种做法一样会死循环。
因为起点固定,所以用一个visit数组就可以解决。
Code:
#include<iostream>
using namespace std;
int n;//城市数
int m;//道路数
int s;//起点
int d;//终点
int r[505] = { 0 };//r[i]表示第i个城市的救援队数量
int g[505][505] = { 0 };//g[i][j]表示城市i到城市j的距离
int visit[505] = { 0 };
int cost = 0;//当前的花费
int rescue = 0;//当前的救援队数量
int mincost = 999999;
int pathcnt = 0;
int maxrescue = -1;
void dfs(int city) {
if (city == d) {//到达终点
if (cost < mincost) {
pathcnt = 1;
maxrescue = rescue;
mincost = cost;
}
else if (cost == mincost) {
pathcnt++;
maxrescue = rescue > maxrescue ? rescue : maxrescue;
}
return;
}
for (int i = 0; i < n; i++)
{
if (!visit[i] && g[city][i] != 0) {
cost += g[city][i];
rescue += r[i];
visit[i] = 1;
dfs(i);
cost -= g[city][i];
rescue -= r[i];
visit[i] = 0;
}
}
}
int main() {
cin >> n >> m >> s >> d;
for (int i = 0; i < n; i++)
{
cin >> r[i];
}
for (int i = 0; i < m; i++)
{
int a, b, c;
cin >> a >> b >> c;
g[a][b] = g[b][a] = c;
}
rescue += r[s];
visit[s] = 1;
dfs(s);
cout << pathcnt << " " << maxrescue;
return 0;
}