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