HDU-1596 find the safest road

最短路的变型,简单题。

刚开始竟然忘了是多组数据!!!

/*
 * hdu-1596	find the safest road
 * mike-w
 * 2011-8-25
 * ---------------------
 * AC 1000+ms
 */
#include<stdio.h>
#define SIZE 1111

int n,m;
double s[SIZE][SIZE];
double dist[SIZE];
int in[SIZE];

int extract(void)
{
	int i,t;

	for(i=1;i<=n;i++)
		if(!in[i]&&dist[i]>-9999.0)
			break;
	for(t=i++;i<=n;i++)
		if(!in[i]&&dist[i]>dist[t])
			t=i;
	return t>n?-1:t;
}

double dij(int e1,int e2)
{
	int i,max;

	for(i=1;i<=n;i++)
		dist[i]=-9999.0,in[i]=0;
	dist[e1]=1.0;
	while((max=extract())!=e2)
	{
		if(max==-1)
			return -1.0;
		in[max]=1;
		for(i=1;i<=n;i++)
			if(!in[i]&&s[max][i]>0.0&&dist[max]*s[max][i]>dist[i])
				dist[i]=dist[max]*s[max][i];
	}
	return dist[e2];
}

int main(void)
{
	int i,j,t1,t2;
	double t3;

#ifndef ONLINE_JUDGE
	freopen("1596.in","r",stdin);
#endif

	while(scanf("%d",&n)!=EOF)
	{	
		for(i=1;i<=n;i++)
			for(j=1;j<=n;j++)
				scanf("%lf",s[i]+j);
		scanf("%d",&m);
		while(m-->0)
		{
			scanf("%d%d",&t1,&t2);
			if((t3=dij(t1,t2))>0)
				printf("%.3lf\n",t3);
			else
				puts("What a pity!");
		}
	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值