WooKinson

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

记:

本题目考的是最小生成数,可使用Kruskal算法

第一次,20分  原因:使用动态数组,有概率报运行错误(大雾= =)

第二次,100分  原因:改用静态数组,一次过

 

示例代码:

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #define INF 99999999
  4 
  5 typedef struct node node_t;
  6 typedef struct node
  7 {
  8     int S;
  9     int E;
 10     int L;
 11 }node;
 12 node e[111111];
 13 
 14 int N,P;    /*N个结点,P条路*/
 15 int c[111111];        /*纪录在牧场逗留的时间*/
 16 int d[111111];        /*纪录牧场之间的距离*/
 17 
 18 void sort(int x, int y)
 19 {
 20     int i = x , j = y;
 21     node p;
 22     p = e[i];
 23     if (i < j)
 24     {
 25         while (i < j)
 26         {
 27             while (i < j && e[j].L > p.L)
 28             {
 29                 j --;
 30             }
 31             if (i < j)
 32             {
 33                 e[i] = e[j];
 34                 i ++;
 35             }
 36             while (i < j && e[i].L < p.L)
 37             {
 38                 i ++;
 39             }
 40             if (i < j)
 41             {
 42                 e[j] = e[i];
 43                 j --;
 44             }
 45         }
 46         e[i] = p;
 47         sort(x,i-1);
 48         sort(i+1,y);
 49     }
 50     return ;
 51 }
 52 
 53 int find(int x)
 54 {
 55     if (x == d[x])
 56     {
 57         return x;        
 58     }
 59     d[x] = find(d[x]);
 60     return d[x];
 61 }
 62 
 63 int Kruskal()
 64 {
 65     int i;
 66     int S,E;
 67     int sum = 0 , count = 1 ;
 68     for (i = 1 ; i <= N ; i ++)
 69     {
 70         d[i] = i;
 71     }
 72     
 73     sort(1,P);
 74     
 75     for (i = 1 ; i <= P ; i++)
 76     {
 77         S = find(e[i].S);
 78         E = find(e[i].E);
 79         if (S != E)/*两点没有交集*/
 80         {            
 81             sum += e[i].L;
 82             d[S] = e[i].E;
 83             count ++;
 84             if (count == N)
 85             {
 86                 break;
 87             }
 88         }
 89     }
 90     return sum;
 91 }
 92 
 93 int main(void)
 94 {
 95     int i = 0 , min = INF;
 96     int S,E,L;
 97     
 98     scanf("%d %d",&N,&P);
 99     
100     for (i = 1 ; i <= N ; i ++)
101     {
102         scanf("%d",&c[i]);
103         if (c[i] < min)
104         {
105             min = c[i];
106         }
107     }
108     
109     for (i = 1 ; i <= P ; i ++)
110     {
111         scanf("%d %d %d",&S,&E,&L);
112         e[i].S = S;
113         e[i].E = E;
114         e[i].L = L*2 + c[S] + c[E];
115     }
116     
117     printf("%d",min+Kruskal());
118     return 0;    
119 }

 

posted on 2018-03-06 10:11  WooKinson  阅读(210)  评论(0编辑  收藏  举报