一开始各种WA,后来看了DISCUSS才知道有1 0 这个数据,坑得很,代码写得不好,各位看官将就着看吧
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 510;
const double inf = 10000086;
int visit[maxn];
double matrix[maxn][maxn];
double Time[maxn];
int n,m;
int maxkey;
double dijkstra()
{
memset(visit,0,sizeof(visit));
for(int i = 2; i <= n; i++)
Time[i] = matrix[1][i];
visit[1] = 1;
for(int i = 0; i < n-1; i++)
{
double mintime = inf;
int v;
for(int j = 1; j <= n; j++)
{
if(!visit[j] && Time[j] < mintime)
{
mintime = Time[j];
v = j;
}
}
visit[v] = 1;
for(int k = 1; k <= n; k++)
{
if(!visit[k] && matrix[v][k]+Time[v] < Time[k])
{
Time[k] = matrix[v][k] + Time[v];
}
}
}
int maxtime = 0;
maxkey = 1;
for(int i = 1; i <= n; i++)
{
if(Time[i] > maxtime)
{
maxtime = Time[i];
maxkey = i;
}
}
return maxtime;
}
int main()
{
freopen("input.txt","r",stdin);
cout.precision(1);
int kase = 0;
while(cin >> n >> m && (n || m))
{
int u,v;
double t;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == j)
matrix[i][j] = 0;
else
matrix[i][j] = inf;
}
}
for(int i = 0; i < m; i++)
{
cin >> u >> v >> t;
matrix[u][v] = matrix[v][u] = t;
}
double maxkeytime = dijkstra();
int ans1,ans2;
double middletime = 0;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(matrix[i][j] == inf)
continue;
double t = (Time[i]+Time[j]+matrix[i][j])/2.0;
if(t > middletime)
{
middletime = t;
ans1 = i;
ans2 = j;
}
}
}
printf("System #%d\n",++kase);
if(middletime > maxkeytime)
cout << "The last domino falls after " << fixed << middletime << " seconds, between key dominoes "
<< ans1 << " and " << ans2 << "." << endl << endl;
//printf("The last domino falls after %lf seconds, between key dominoes %d and %d.\n",middletime,ans1,ans2);
else
cout << "The last domino falls after " << fixed << maxkeytime << " seconds, at key domino "
<< maxkey << "." << endl << endl;
//printf("The last domino falls after %lf seconds, at key domino %d.\n",maxkeytime,maxkey);
}
return 0;
}