ZOJ 2433 Highways

来源:互联网 发布:疯狗雾化器做丝数据 编辑:程序博客网 时间:2024/05/01 23:06

ZOJ  2433 Highways

   寒假里写完这道题一直都在Segmentation Fault,其实感觉这种情况的最好的解决办法就是过一段时间对题目有认识之后重新写一遍就好了。

    题意:到现在都忘了当时读题读的很纠结了。就是说城市之间只有单行线,现在要在这些城市之间修两条路,保证所有城市相互之间都可以往返,要求是这两条新路的起点城市和终点城市都要不同,并且保证这两条路的总长度最短。

    思路:要想所有城市相互之间都可以往返,其实必须要建一条包含所有城市的路线,比如从第一个城市到最后一个城市就够了,但是题目要求建两条,那只要这两条(一条起于第一个城市,一条起于最后一个城市)在两个城市之间的距离最近的两个城市之间交叉就可以了。

    代码+细节如下:

  

#include<stdio.h>int main(){int N,i,j,n,sum,min,a[50050],b[50020],c,d;scanf("%d",&N);for(i = 1;i<=N;i++){getchar();scanf("%d",&n);for(j = 0;j<=n-1;j++){if(j==0)a[j] = 0;elsescanf("%d",&a[j]);}b[0] = 0;sum = 0;for(j = 1;j<=n-1;j++){b[j] = a[j] - a[j-1];sum = sum+b[j];}min = 1000050000;for(j = 2;j<=n-2;j++){    /*这里取的两城市之间距离最短的两个城市*/if(b[j]<min){         /*不可以去最前面的两个,也不可以去最后的两个*/min = b[j];c = j+1;d = j;}}if(min==1000050000){        /*一开始这里WA,因为我写的条件是城市必须大于四个*/printf("0\n");          /*但是一定还有其他不符合题意的情况,所以用这种写法可以全都概括*/}else{                      /*谨记!!*/printf("%d\n",sum+min);printf("%d 1 %d %d\n",c,n,d);}if(i!=N)printf("\n");}return 0;}