#include <stdio.h>
#include <string.h>
#include <cstdio>
#include <algorithm>
using namespace std;
const int INF = 1 << 27;
const int N = 1005;
int path[N][N], path0[N][N];
int m, n;
int Min(int a, int b)
{
return a > b ? b : a;
}
int floyd(int k)
{
int i, j;
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
{
if(i == k || j == k) path[i][j] = INF;
else path[i][j] = path0[i][j];
}
for(k = 1; k <= n; k ++)
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
path[i][j] = Min(path[i][k] + path[k][j], path[i][j]);
return path[1][n];
}
int main()
{
// freopen("in.txt", "r", stdin);
int i, j, A, B, C, st, ed, maxx, num;
while(~scanf("%d%d", &n, &m) && (n || m))
{
maxx = 0;
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
{
if(i == j) path0[i][j] = path0[i][j] = 0;
else path0[i][j] = path0[j][i] = INF;
}
for(i = 1; i <= m; i ++)
{
scanf("%d%d%d", &A, &B, &C);
if(path0[A][B] > C) path0[A][B] = path0[B][A] = C;
}
for(i = 2; i < n; i ++)
{
num = floyd(i);
if(maxx < num) maxx = num;
}
if(maxx == INF) printf("Inf\n");
else printf("%d\n", maxx);
}
return 0;
#include <string.h>
#include <cstdio>
#include <algorithm>
using namespace std;
const int INF = 1 << 27;
const int N = 1005;
int path[N][N], path0[N][N];
int m, n;
int Min(int a, int b)
{
return a > b ? b : a;
}
int floyd(int k)
{
int i, j;
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
{
if(i == k || j == k) path[i][j] = INF;
else path[i][j] = path0[i][j];
}
for(k = 1; k <= n; k ++)
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
path[i][j] = Min(path[i][k] + path[k][j], path[i][j]);
return path[1][n];
}
int main()
{
// freopen("in.txt", "r", stdin);
int i, j, A, B, C, st, ed, maxx, num;
while(~scanf("%d%d", &n, &m) && (n || m))
{
maxx = 0;
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
{
if(i == j) path0[i][j] = path0[i][j] = 0;
else path0[i][j] = path0[j][i] = INF;
}
for(i = 1; i <= m; i ++)
{
scanf("%d%d%d", &A, &B, &C);
if(path0[A][B] > C) path0[A][B] = path0[B][A] = C;
}
for(i = 2; i < n; i ++)
{
num = floyd(i);
if(maxx < num) maxx = num;
}
if(maxx == INF) printf("Inf\n");
else printf("%d\n", maxx);
}
return 0;
}
心得:弗洛伊德变形,注意寻找最大权值时记得添一个不变的中介矩阵,否则每一次遍历会在上一次的基础上。