正确
#include<iostream>
#include<cstring>
using namespace std;
int n, ans=0x7fffffff;
int dis[110][110], k[110];
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
memset(dis, 0x3f, sizeof(dis));
cin >> n;
int l, r;
for (int i = 1; i <= n; ++i)
{
cin >> k[i] >> l >> r;
if (l != 0) dis[i][l] = dis[l][i] = 1;
if (r != 0) dis[i][r] = dis[r][i] = 1;
}
for (int i = 1; i <= n; ++i) dis[i][i] = 0;
for (int k = 1; k <= n; ++k)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
if (k != i && i != j && j != k)
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
for (int i = 1; i <= n; ++i)
{
int sum = 0;
for (int j = 1; j <= n; ++j)
sum += dis[i][j] * k[j];
ans = min(ans, sum);
sum = 0;
}
cout << ans;
return 0;
}
连样例过不了的
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int n, m, u, v, s;
//int map[200][200];
int dis[200][200];
int main()
{
ios::sync_with_stdio(0), cin.tie(0);
//memset(map, 0x7f, sizeof(map));
memset(dis, 0x7f, sizeof(dis));
for (int i = 1; i <= n; ++i) dis[i][i] = 0;
cin >> n >> m;
for (int i = 1; i <= m; ++i)
{
cin >> u >> v >> s;
//map[v][u] = map[u][v] = s;
dis[v][u] = dis[u][v] = min(dis[u][v], s);
}
for (int k = 1; k <= n; ++k)
for (int i = 1; i <= n; ++i)
for (int j = 1; j <= n; ++j)
if (i != k && k != j && j != i)
dis[i][j] = min((ll)dis[i][j], (ll)dis[i][k] + dis[k][j]);
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
cout << (dis[i][j] == 2139062143 ? 0 : dis[i][j]) << ' ';
cout << endl;
}
return 0;
}
仅仅就把dis[i][i]=0换到下面就不行了