zoj 1298 Domino Effect(最短路)

ca,交了一晚上早上起来发现,初始化时把n和m搞错了.....囧

题意:

从第一张骨牌开始推,问最后一张倒下的牌是第几张骨牌或者是哪两张骨牌之间的关键牌和全部倒下的时间。

yy:

初看还真不能发现是最短路,所以做题抽象出其数学模型还是很重要的。把到每个点的最短路径求出来(dijkstra),再把每条路完全倒下的时间求出来,

比较下两者就知道是那种情况。

因为之前把n和m搞混了,昨晚没改全,今天贡献了一个wa后果断发现改过,再交终于红艳艳的accept

#include<iostream>
#include<cstdio>
#include <string.h>
#define inf 1000000
using namespace std;
int main()
{
	int n,m;
	int i,j,k,Case=1;
	int pos,pos1,pos2;
	int sorce,target,weight,a[505][505];
	int min[505],S[505],mm,u;
	double time,max1,max;
	while(scanf("%d%d",&n,&m))
	{
		if(m==0&&n==0) break;
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
			{
				if(i==j)
				a[i][j]=0;
				else
				a[i][j]=a[j][i]=inf;
			}
		for(i=0;i<m;i++)
		{
			cin>>sorce>>target>>weight;
			a[sorce-1][target-1]=a[target-1][sorce-1]=weight;
		}
		printf("System #%d\n",Case++);
		for(i=0;i<n;i++)
			S[i]=0,min[i]=a[0][i];
		min[0]=0;
		for(S[0]=1,i=0;i<n;i++)
		{
			for(mm=inf,u=0,j=0;j<n;j++)
			{
				if(!S[j]&&mm>min[j])
				{
					u=j;
					mm=min[j];
				}
			}
			for(S[u]=1,k=0;k<n;k++)
			{
				if(!S[k]&&a[u][k]<inf&&min[k]>min[u]+a[u][k])
					min[k]=min[u]+a[u][k];
			}
		}
		max1=-inf;
		for(i=0;i<n;i++)
			if(max1<min[i])
			{
				max1=min[i];
				pos=i;
			}
		max=-inf;
		for(i=0;i<n;i++)
			for(j=0;j<n;j++)
			{
				time=(min[i]+min[j]+a[i][j])/2.0;
				if(a[i][j]<inf&&max<time)
				{
					max=time;
					pos1=i;
					pos2=j;
				}
			}	
		if(max1<max)
			printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n\n",max,pos1+1,pos2+1);
		else
		{
			printf("The last domino falls after %.1lf seconds, at key domino %d.\n\n",max1,pos+1);
		}
	}
	return 0;
}

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值