贪婪的copy
题目描述
Copy从卢牛那里听说在一片叫yz的神的领域埋藏着不少宝藏,于是Copy来到了这个被划分为个区域的神地。卢牛告诉了Copy这里共有个宝藏,分别放在第Pi个(1<=Pi<=N)区域。Copy还得知了每个区域之间的距离。现在Copy从1号区域出发,要获得所有的宝藏并到n号区域离开。Copy很懒,只好来找你为他寻找一条合适的线路,使得他走过的距离最短。
分析
- 从题意得知我们需要知道任意两点间的最短距离,题目数据范围较小可以锁定弗洛伊德算法
- 我们可以采用爆搜的来得到符合要求的最短路径
code
#include<bits/stdc++.h>
using namespace std;
const int N = 1100;
typedef long long ll;
int n, m, k, t;
int g[N][N];
int v[N], ans = 0x3f3f3f3f;
bool st[N];
void floyd()
{
for(int k = 1; k <= n; k ++)
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
}
void dfs(int x, int num, int sum)
{
if(!num)
{
ans = min(ans, sum + g[x][n]);
return;
}
for(int i = 1; i <= m; i ++)
{
if(!st[i])
{
st[i] = true;
dfs(v[i], num - 1, sum + g[x][v[i]]);
st[i] = false;
}
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= n; j ++)
cin >> g[i][j];
cin >> m;
for(int i = 1; i <= m; i ++) cin >> v[i];
floyd();
dfs(1, m, 0);
cout << ans << "\n";
return 0;
}