http://poj.org/problem?id=2263
题目是求一条能承载最重货物量的路径,只需求出最大的承载量。这题可以利用Floyd思想来解决,从i到j的路径中假设经过k,则该条路最少的承载量为min{ map[i][k] , map[k][j]},故对应的i到j的最大承载量为max{ map[i][j] , min{map[i][k] , map[k][i]}}。这样问题就可以解决了。
源代码如下:
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std ;
char city[205][35] ;
int map[205][205] ;
int m ;
int n ;
int csize ;
void floyd() ;
int main()
{
int i ;
int j ;
int p ;
int k ;
int q ;
int s ;
q = 1 ;
char str1[35] ;
char str2[35] ;
while(scanf("%d %d" , &m , &n)!=EOF && n&&m)
{
memset(city , 0 ,sizeof(city)) ;
memset(map , 0 , sizeof(map)) ;
csize = 0 ;
for(i = 0 ; i < n ; i ++)
{
scanf("%s %s %d" , str1 , str2 , &p) ;
k = -1 ;
s = -1 ;
for(j = 0 ; j < csize ; j ++)
{
if(!strcmp(city[j] , str1))
{
k = j ;
}
if(!strcmp(city[j] , str2))
{
s = j ;
}
}
if(k==-1)
{
strcpy(city[csize] , str1) ;
k = csize ;
csize ++ ;
}
if(s==-1)
{
strcpy(city[csize] , str2) ;
s = csize ;
csize ++ ;
}
map[k][s] = map[s][k] = p ;
}
scanf("%s %s" , str1 , str2) ;
k = -1 ;
s = -1 ;
for(j = 0 ; j < csize ; j ++)
{
if(!strcmp(city[j] , str1))
{
k = j ;
}
if(!strcmp(city[j] , str2))
{
s = j ;
}
}
floyd() ;
printf("Scenario #%d\n%d tons\n\n" , q ++ , map[k][s] ) ;
}
return 0 ;
}
void floyd()
{
int i ;
int j ;
int k ;
int temp ;
for(k = 0 ; k < m ; k ++)
{
for(i = 0 ; i < m ; i ++)
{
for(j = 0 ; j < m ; j ++)
{
temp = map[i][k] > map[k][j] ? map[k][j] : map[i][k] ;
map[i][j] = temp > map[i][j] ? temp : map[i][j] ;
}
}
}
}