您的位置:首页 > Web前端

ZOJ 1298 Domino Effect 遗憾之Segmentation Fault

2013-08-10 21:10 260 查看
ZOJ 
1298  Domino Effect  遗憾之Segmentation Fault
     遇到Segmentation Fault一向不会改,课本上摘来几个图的例子都过了。求指导!!

     题意:用多米诺骨牌做一个图,每当一个关键块(类似顶点)倒下,和它连着的那一排(类似边)就会倒下,问全部倒完要用多长时间?最后倒下的是关健块,还是两个关健块之间的块,如果是关健块,输出这个关健块的骨牌编号,如果是两个关健块之间的,输出这两个关健块的骨牌编号。

     最短路之迪杰斯特拉算法,如果最后倒下的是一个关健块,就是这个顶点的最短路径;如果不是,很明显但是不太好想,每条边倒下的时间分别是它的两个顶点倒下的时间的和再加上这条边自己需要的时间,这个总和的一半。从两端走到最后一个骨牌的路径不同,但时间相同!!!

     细节+代码:

 

    

#include<stdio.h>
#include<string.h>

#define MAX 1000000.00

double min[600],edge[600][600],time[600][600];
int visit[600],n,e;

int dijkstra(int v0){
int i,u,j;
double temp;
for(i = 1;i<=n;i++)
min[i] = edge[v0][i];
visit[v0] = 1;
for(i = 1;i<=n;i++){
temp = MAX;
for(j = 1;j<=n;j++){
if(visit[j]!=1&&min[j]<temp){
temp = min[j];
u = j;
}
}
visit[u] = 1;
for(j = 1;j<=n;j++){
if(visit[j]!=1&&edge[u][j]<MAX&&min[j]>min[u]+edge[u][j])
min[j] = min[u]+edge[u][j];
}
}
return 0;
}

int main(){
int i,j,k,endn,fronte,ende,a,b;
double maxn,maxe;
for(i = 1;;i++){
memset(visit,0,sizeof(visit));
for(j = 0;j<=590;j++){ //因为段错误写的初始化,觉得没必要,而且依然段错误。
min[j] = 0.00;
for(k = 0;k<=590;k++){
time[j][k] = MAX;
edge[j][k] = MAX;
}
}
scanf("%d%d",&n,&e);
if(n==0&&e==0)
break;
if(n==1){ //一个顶点的情况。
printf("System #%d\n",i);
printf("The last domino falls after 0.0 seconds, at key domino 1\n\n");
continue;
}
for(j = 1;j<=n;j++){
for(k = 1;k<=n;k++){
if(j==k)
edge[j][k] = 0.00;
else
edge[j][k] = MAX;
}
}
for(j = 1;j<=e;j++){
scanf("%d%d",&a,&b);
scanf("%lf",&edge[a][b]);
edge[b][a] = edge[a][b];
}
dijkstra(1);
maxn = 0.00;
for(j = 1;j<=n;j++){
if(min[j]>maxn&&min[j]<MAX){
maxn = min[j];
endn = j;
}
}
maxe = 0.00;
for(j = 1;j<=n;j++){
for(k = i+1;k<=n;k++){
if(min[j]<MAX&&min[k]<MAX&&edge[j][k]<MAX)
time[j][k] = (min[j]+min[k]+edge[j][k])/2*1.000;
if(time[j][k]>maxe&&time[j][k]<MAX){
maxe = time[j][k];
fronte = j;
ende = k;
}
}
}
if(maxn>=maxe){
printf("System #%d\n",i);
printf("The last domino falls after %.1lf seconds, at key domino %d.\n\n",maxn,endn);
}
else{
printf("System #%d\n",i);
printf("The last domino falls after %.1lf seconds, between key dominoes %d and %d.\n\n",maxe,fronte,ende);
}
}
return 0;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: