改对了,但有个小地方不明白,求解答
查看原帖
改对了,但有个小地方不明白,求解答
372404
tiko_tao楼主2024/8/5 10:56

这个题我在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;
		}
	}
2024/8/5 10:56
加载中...