您的位置:首页 > Web前端

Domino Effect ZOJ 1298 POJ 1135 Dijkstra

2013-03-31 23:04 323 查看
这题WA很久,然后找不出原因,后来看了书上的程序(图论理论算法实现及应用神马的),然后感觉不出来自己哪里错了,后来改了改,把无穷大的定义改小了点,再放到ZOJ上,成功AC了,我都不知道为什么,也许还改了其他地方,我已经糊涂了,然后又把它放POJ 1135上又WA了,我都憔悴了,最后我想起以前刷水题时要把double用%f输出,我试了一下,果然AC了,求解释`````

贴代码:

View Code

#include <cstdio>
#include <cstring>
#define MAXN 505
#define INF 1000000
int n;
int edge[MAXN][MAXN];
bool s[MAXN];
int time[MAXN];
void Dijkstra()
{
int i,j;
for(i=1; i<=n; i++)
time[i] = edge[1][i];
memset(s,false,sizeof(s));
s[1] = true;
for(i=1; i<n; i++)
{
int min = 1000000;
int v = 1 ;
for(j = 1; j<=n; j++)
{
if(!s[j] &&time[j] < min)
{
min = time[j];
v = j;
}
}
s[v] = true;//表明v算过了
for(j=1; j<=n ; j++)
{
if(!s[j] && edge[v][j] < INF && time[v] + edge[v][j] < time[j])//该点没被算过,v到j有边存在,距离更短
time[j] = time[v] + edge[v][j] ;
}
}
double max1 = -1;
int po;
time[1] = 0;
for(i=1; i<=n; i++)
{
if(time[i] > max1)
{
max1 = time[i];
po = i;
}
}
double max2 = -1;
int pox,poy;
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
{
int t;
if(edge[i][j] == INF) continue;
double temp = (time[i] + time[j] + edge[i][j])/2.0 ;
if(temp > max2 )
{
max2 = temp;
pox = i;
poy = j;
}
}
}
if(max2 > max1)
{
printf("The last domino falls after %.1f seconds, between key dominoes %d and %d.\n\n",max2,pox,poy);
}
else
{
printf("The last domino falls after %.1f seconds, at key domino %d.\n\n",max1,po);
}
}
int main()
{
//    freopen("in.cpp","r",stdin);
int m;
int ser  = 0;
while(~scanf("%d%d",&n,&m))
{
if(n==0 && m == 0) break;
int i,j;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
edge[i][j] = INF;
for(i=0; i<m; i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
edge[u][v] = edge[v][u] = w;
}
printf("System #%d\n",++ser);
Dijkstra();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: