回复 8楼 zhu224039
我说哥们,我觉得你做的不对呀。我试了你的做法,但是边的去除是可以随便去的,不是顺序去掉的。你去除的边每次只能是先前去,或者向后去。如果边数为6,暴力的话是6的阶乘,您能够给出具体的实现算法吗。求教。
1 //bccn.c 2 #include <stdio.h> 3 #include <stdlib.h> 4 5 enum opr 6 { 7 ADD = 1, 8 // SUB, 9 MUL = 2, 10 // DIV, 11 }; 12 13 int *head_array; 14 int *node_array; 15 16 int f(int x, int y, int size) 17 { 18 int i; 19 int sum = 0; 20 21 for (i=0; i<x; ++i) 22 { 23 --size; 24 sum += size; 25 } 26 sum += y; 27 28 return sum; 29 } 30 31 void uf(int *x, int *y, int size, int sum) 32 { 33 for (*x = 0; *x <= sum; ++(*x)) 34 { 35 --size; 36 *x += size; 37 } 38 if (0 != *x) 39 { 40 *x -= size; 41 } 42 *y = sum - *x; 43 } 44 45 int cacu(int size) 46 { 47 int i = (size * (size - 1))/2; 48 int x = 0, y = 0; 49 int flag = 1; 50 int max = 0; 51 52 while (i) 53 { 54 uf(&x, &y, size, i-1); 55 switch (node_array[i-1]) 56 { 57 case ADD: 58 node_array[i-1] = head_array[x+1] + head_array[y+2+x]; 59 break; 60 // case SUB: 61 break; 62 case MUL: 63 node_array[i-1] = head_array[x+1] * head_array[y+2+x]; 64 break; 65 // case DIV: 66 break; 67 default: 68 break; 69 } 70 if (flag) 71 { 72 flag = 0; 73 max = node_array[i-1]; 74 } 75 else 76 { 77 max = max>node_array[i-1]? max : node_array[i-1]; 78 } 79 80 --i; 81 } 82 83 return max; 84 } 85 86 int main(void) 87 { 88 int size; 89 int arc; 90 int i; 91 int vec1, vec2;//边的两点 92 int operator;//操作码[1, 4] 93 94 printf ("输入结点个数:"); 95 scanf("%d", &size); 96 97 head_array = malloc (sizeof(int)*(size+1)); 98 memset(head_array, 0, sizeof(int)*(size+1)); 99 node_array = malloc (sizeof(int)*((size*(size-1))/2)); 100 memset(node_array, 0, sizeof(int)*((size*(size-1))/2)); 101 102 printf ("依次输入结点上的数据:"); 103 for (i = 1; i <= size; ++i) 104 { 105 scanf("%d", &(head_array[i])); 106 } 107 printf ("\t结点上的数据分别为"); 108 for (i = 1; i <= size; ++i) 109 { 110 printf ("(%d, %d) ", i, head_array[i]); 111 } 112 printf ("\n"); 113 114 printf ("\t输入边的条数\n"); 115 scanf("%d", &arc); 116 for (i = 1; i <= arc; ++i) 117 { 118 printf ("输入边的信息(1<=vec1<vec2):"); 119 scanf("%d %d %d", &vec1, &vec2, &operator); 120 node_array[f(vec1-1, vec2-1-vec1, size)] = operator; 121 } 122 123 printf ("最大值为:%d\n", cacu(size)); 124 125 return 0; 126 }