题目链接
http://poj.org/problem?id=1135
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<queue>
#include<algorithm>
#include<string.h>
#include<map>
#include<vector>
#include<string>
#include<stack>
#define N 505
#define M 10005
#define INF 0x3f3f3f
using namespace std;
struct E{
int next;
double c;
};
vector<E> edge[N];//邻接链表
double dis[N];
bool mark[N];
int n,m;
int main()
{
int cnt=1;
while(cin>>n>>m)
{
if(n==0&&m==0)
break;
for(int i=1;i<=n;i++)
{
edge[i].clear();
dis[i]=-1;
mark[i]=false;
}
while(m--)
{
int a,b;
double t;
cin>>a>>b>>t;
E tmp;
tmp.c=t;
tmp.next=b;
edge[a].push_back(tmp);
tmp.next=a;
edge[b].push_back(tmp);
}
dis[1]=0;
mark[1]=true;
int newp=1;//新加入节点
for(int i=1;i<n;i++)
{//循环余下n-1个节点
for(int j=0;j<edge[newp].size();j++)
{
int b=edge[newp][j].next;
double t=edge[newp][j].c;
if(mark[b]==true) continue;
if(dis[b]==-1||dis[b]>dis[newp]+t)
dis[b]=dis[newp]+t;
}
double min=INF;
for(int j=1;j<=n;j++)
{
if(mark[j]==true) continue;
if(dis[j]==-1) continue;
if(dis[j]<min)
{
min=dis[j];
newp=j;
}
}
mark[newp]=true;
}
double ans=-1;
int a1=-1,a2=-1;
for(int i=1;i<=n;i++)
{
if(ans<dis[i])
{
ans=dis[i];
a1=i;
}
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<edge[i].size();j++)
{
int b=edge[i][j].next;
double t=edge[i][j].c;
double tmp=(dis[i]+dis[b]+t)/2.0*1.0;
if(ans<tmp)
{
ans=tmp;
a1=i;
a2=b;
}
}
}
printf("System #%d\n",cnt++);
if(a2==-1)
{
printf("The last domino falls after %.1lf seconds, at key domino %d.\n",ans,a1);
}
else
{
printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n",ans,a1,a2);
}
printf("\n");
}
return 0;
}