记:
本题目考的是最小生成数,可使用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 }