zoj1665-Transport Goods

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 ;		
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值