伤不起!!!!!!!!!!!!!!!!!!!!!!!!!!
V1竟然要先赋成1 要不就WA。。。还有这个图是双向的 eg[a][b]=eg[b][a]=t;
题意: 多米诺骨牌 找出最后在哪里倒塌;
题解: 好你妹个DIJKSTRA啊!!坑死我了!!有两种情况,一种是在关键牌倒塌,一种是在两者之
间倒塌,所以,先用dijkstra先算出每点的最短路,再看每条边的时间;取最大;
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define INF 100001000
int eg[510][510],n;
double time1[510];
int s[510];
void Dijskral()
{
for(int i=1;i<=n;i++)
{
s[i]=0;
time1[i]=eg[1][i];
}
s[1]=1;
for(int i=1;i<n;i++)
{
double min=INF;
int u=1;
for(int j=1;j<=n;j++)
{
if(!s[j]&&time1[j]<min)
{
min=time1[j];
u=j;
}
}
s[u]=1;
for(int j=1;j<=n;j++)
{
if(!s[j]&&eg[u][j]+time1[u]<time1[j])
{
time1[j]=eg[u][j]+time1[u];
}
}
}
}
int main()
{
int m,cas=1;
while(scanf("%d%d",&n,&m)&&(n||m))
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
if(i==j)
eg[i][j]=0;
else
eg[i][j]=INF;
}
}
for(int i=0;i<m;i++)
{
int a,b,t;
scanf("%d%d%d",&a,&b,&t);
if(eg[a][b]>t)
eg[a][b]=eg[b][a]=t;
}
double MAX_time2=0;
double MAX_time1=0;
int V1=1,V2=0,V3=0;
Dijskral();
for(int i=1;i<=n;i++)
{
if(time1[i]>MAX_time1)
{
MAX_time1=time1[i];
V1=i;
}
}
double k=0;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(eg[i][j]<INF&&eg[i][j])
{
k=((double)(time1[i]+time1[j]+eg[i][j]))/2.0;
if(k>MAX_time2)
{
MAX_time2=k;
V2=i;V3=j;
}
}
}
}
printf("System #%d\n",cas++);
if(MAX_time2 > MAX_time1)
printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n",MAX_time2,V2,V3);
else
printf("The last domino falls after %.1f seconds, at key domino %d.\n\n",MAX_time1,V1);
}
return 0;
}