回复 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 }
