无语了,第一次因为溢出错这么多次。最大值不能设置为0x3f3f3f3f ,要不然三个它相加就溢出了,一直错。
这题问的是从一个点出发,经过其它不同两点,回到起点,这个环的最小值,也就是说边ab+bc+ca的值。
我们可以不断地进行松弛操作,每次调整最小的环值,我们比较的是,当前最小环值和从 min(ac)+dis(ab)+dis(bc) ,这样我们就一定经过了不同的两点,从而更新了环值。
默默补一句,不知初始毁一生,越界溢出也毁一生。。。
#include <cstdio>
#include <cstring>
const int INF = 1000000;
int map[105][105];
int dis[105][105];
int n, m, minc;
int min(int x,int y)
{
return x < y ? x : y;
}
void floyd()
{
minc = INF;
for (int k = 1; k <= n;k++) {
for (int i = 1; i <= k;i++) {
for (int j = i + 1; j <= k;j++) {
minc = min(minc, dis[i][j] + map[i][k] + map[k][j]);
}
}
for (int i = 1; i <= n;i++) {
for (int j = 1; j <= n;j++) {
dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
}
}
}
}
int main()
{
while (scanf("%d%d",&n,&m)!=EOF) {
for (int i = 0; i <= n;i++) {
for (int j = 0; j <= n;j++) {
map[i][j] = INF;
dis[i][j] = INF;
}
}
int s, e, c;
for (int i = 1; i <= m;i++) {
scanf("%d%d%d", &s, &e, &c);
if (c<map[s][e]) {
map[s][e] = c;
map[e][s] = c;
dis[s][e] = c;
dis[e][s] = c;
}
}
floyd();
if (minc<INF)
printf("%d\n", minc);
else
printf("It's impossible.\n");
}
return 0;
}