这个题我在dfs的时候标记是否被到达过用了a[i]是80分,但改成i之后就过了,一直想不明白
以下是通过代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 100 + 10;
int n;
int a[11], dis[N][N];
bool vis[N];
int ans = INT_MAX, T;
void dfs(int now, int m, int sum)
{
if (m == 0)
{
ans = min(ans, sum + dis[now][n]);
return ;
}
for (int i = 1; i <= T; i++)
{
if (!vis[i])
{
vis[i] = true;
dfs(a[i], m - 1, sum + dis[now][a[i]]);
vis[i] = false;
}
}
}
signed main()
{
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
scanf ("%lld", &dis[i][j]);
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
if (dis[i][k] != 0 && dis[k][j] != 0)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
cin >> T;
for (int i = 1; i <= T; i++)
scanf ("%lld", &a[i]);
dfs(1, T, 0);
cout << ans << endl;
return 0;
}
原来也就是dfs里的for有个小变化
for (int i = 1; i <= T; i++)
{
if (!vis[a[i]])
{
vis[a[i]] = true;
dfs(a[i], m - 1, sum + dis[now][a[i]]);
vis[a[i]] = false;
}
}