#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n, m, k;
const int N = 3000;
int side[N][N];//x -> y
int num[N];//number x -> y
int mark[N];
int ways[N][N];//lowest x -> y
int ans = 0;
queue<int> bfs;
int vis[N];
void add(int x, int y)
{
num[x]++;
side[x][num[x]] = y;
}
void init()
{
for(int i = 1; i <= n; i++)
{
for(int k = 1; k <= n; k++) vis[k] = 0;
int t = 0;
bfs.push(i);
vis[i] = 1;
bfs.push(-1);
while(1)
{
int top = bfs.front();
bfs.pop();
if(bfs.empty()) break;
if(top ==-1)
{
t++;
bfs.push(-1);
continue;
}
ways[i][top] = t;
for(int j = 1; j <= num[top]; j++)
{
if(vis[side[top][j]] == 0)
{
bfs.push(side[top][j]);
vis[side[top][j]] = 1;
}
}
}
}
}
void dfs(int start, int times, int sum)
{
if(times == 4)
{
if(ways[start][1] > k + 1) ans = max(0, ans);
else ans = max(sum, ans);
return;
}
for(int i = 1; i <= n; i++)
{
if(vis[i] != 1 && i != start && ways[start][i] <= k + 1)
{
vis[i] = 1;
dfs(i, times + 1, sum + mark[i]);
vis[i] = 0;
}
}
}
int main()
{
freopen("holiday.in","r", stdin);
freopen("holiday.out", "w", stdout);
cin >> n >> m >> k;
for(int i = 2; i <= n; i++)
{
cin >> mark[i];
}
for(int i = 1; i <= m; i++)
{
int x, y;
cin >> x >> y;
add(x, y);
add(y, x);
}
init();
for(int i = 1; i <= n; i++) vis[i] = 0;
vis[1] = 1;
dfs(1, 0, 0);
cout << ans;
return 0;
}
思路是先BFS遍历每个点到其他点的“最少乘车次数”然后DFS
之前在考场过样例的时候也输出过中间数据,也没出现段错误的问题,这是为什么?