http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=655
代码不是很长,但是却写了很久,将Dijkstra进行活学活用,不能只是简单的套模版,而且需要注意的就是需要使用double型的数据,如果使用float型,可能会WA;
题意:
先输入有n ,m,表示存在几组数据,然后输入n-1行,代表需要运输的质量,紧接着输入m行 x ,y , p ,表示从x---->y的费用率,就是扣除的质量的百分率;
转换成求1 - p 就是最大运输率;
#include<stdio.h>
#include<string.h>
int main()
{
int n , m , i , j , now , from ,to ;
int value[ 102 ] ,flag[ 102 ] ;
double rate[ 102 ][ 102 ] , sum , dist[ 102 ] , max , temp ;
while( scanf( "%d %d" , &n , &m ) != EOF )
{
memset( dist , 0 ,n*sizeof( double ) ) ;
memset( flag , 0 ,n*sizeof( int ) );
memset( rate , 0.0 ,sizeof( rate ) ) ;
for( i = 1 ; i < n ; i++ )
scanf( "%d" , &value[ i ] ) ;
for( i = 1 ; i <= m ; i++ )
{
scanf( "%d %d %lf" ,&from , &to , &temp ) ;
if( rate[ from ][ to ] < 1.0 - temp )
rate[ from ][ to ] = rate[ to ][ from ] = 1.0 - temp ;
}
now = n;
//rate[ now ] = 1 ;
flag[ now ] = 1 ;
dist[ now ] = 1 ;
for( i = 1 ; i < n ; i++ )
{
for( j = 1 ; j <= n ; j++)
if( !flag[ j ] && dist[ j ] < rate[ j ][ now ] * dist[ now ] )
dist[ j ] = rate[ j ][ now ] * dist[ now ] ;
max = 0 ;
for( j = 0 ; j <= n ; j++ )
{
if( !flag[ j ] && dist[ j ] > max )
max = dist[ now = j ] ;
}
flag[ now ] = 1;
}
sum = 0 ;
for( i = 0 ; i < n ; i++)
sum += dist[ i ] * value[ i ] ;
printf( "%.2lf\n" , sum ) ;
}
return 0 ;
}