USACO 3.2 Sweet Butter
这个题时间是个大问题,用heap优化的迪杰斯特拉过的。
TASK: butter
LANG: C++
Compiling...
Compile: OK
Executing...
Test 1: TEST OK [0.000 secs, 12192 KB]
Test 2: TEST OK [0.000 secs, 12192 KB]
Test 3: TEST OK [0.000 secs, 12192 KB]
Test 4: TEST OK [0.000 secs, 12192 KB]
Test 5: TEST OK [0.000 secs, 12192 KB]
Test 6: TEST OK [0.000 secs, 12192 KB]
Test 7: TEST OK [0.027 secs, 12192 KB]
Test 8: TEST OK [0.108 secs, 12192 KB]
Test 9: TEST OK [0.135 secs, 12192 KB]
Test 10: TEST OK [0.135 secs, 12192 KB]
All tests OK.
1 /*
2 PROG: butter
3 ID: jiafeim1
4 LANG: C++
5 */
6
7 #include <stdio.h>
8 #include <string.h>
9 #define MAXINT 100000000
10 int cow_count;
11 int heap_size;
12 int value_heap[805];
13 int id_heap[805];
14 int heap_clue[805];
15 int cows[805];
16
17 int road_to[805][1455];
18 int road_cost[805][1455];
19 int road_count[805]={0};
20
21 int res[805]={0};
22
23 bool haveGo[805];
24
25 void heap_swap(int i ,int j)
26 {
27 int temp;
28 temp = value_heap[i];
29 value_heap[i]=value_heap[j];
30 value_heap[j] = temp;
31
32 heap_clue[id_heap[i]]=j;
33 heap_clue[id_heap[j]]=i;
34
35 temp = id_heap[i];
36 id_heap[i]=id_heap[j];
37 id_heap[j] = temp;
38 }
39
40 void heap_up(int i)
41 {
42 while(i>0 && value_heap[i]<value_heap[(i-1)/2])
43 {
44 heap_swap(i,(i-1)/2);
45 i=(i-1)/2;
46 }
47 }
48 void heap_down(int j)
49 {
50 bool haveDo;
51 do
52 {
53 haveDo = false;
54 int left = 2*j+1;
55 int right = 2*j+2;
56 if(right<heap_size && value_heap[right]<value_heap[j] && value_heap[right]<value_heap[left])
57 {
58 heap_swap(j,right);
59 j = right;
60 haveDo = true;
61 continue;
62 }
63 if(left<heap_size && value_heap[left]<value_heap[j])
64 {
65 heap_swap(j,left);
66 j = left;
67 haveDo = true;
68 continue;
69 }
70 }while(haveDo);
71 }
72 int main()
73 {
74 FILE *fin = fopen("butter.in", "r");
75 FILE *fout = fopen("butter.out", "w");
76
77 int n,p,c;
78 fscanf(fin,"%d%d%d",&n,&p,&c);
79 for(int i = 0;i<n;++i)
80 {
81 fscanf(fin,"%d",&(cows[i]));
82 --cows[i];
83 }
84
85 int t1,t2,tc;
86 for(int i=0;i<c;++i)
87 {
88 fscanf(fin,"%d%d%d",&t1,&t2,&tc);
89 --t1;
90 --t2;
91 road_cost[t1][road_count[t1]]=tc;
92 road_to[t1][road_count[t1]]=t2;
93 ++road_count[t1];
94
95 road_cost[t2][road_count[t2]]=tc;
96 road_to[t2][road_count[t2]]=t1;
97 ++road_count[t2];
98 }
99 for(int co = 0;co<n;++co)
100 {
101 int nowCo = cows[co],curid;
102 heap_size = p;
103 for(int ba=0;ba<p;++ba)
104 {
105 value_heap[ba] = MAXINT;
106 id_heap[ba] = ba;
107 heap_clue[ba] = ba;
108 }
109 memset(haveGo,false,p*sizeof(bool));
110 value_heap[nowCo] = 0;
111 heap_up(nowCo);
112 for(int ba=0;ba<p;++ba)
113 {
114 curid = id_heap[0];
115 haveGo[curid] = true;
116 heap_swap(0,heap_size-1);
117 --heap_size;
118 heap_down(0);
119 for(int side = 0;side<road_count[curid];++side)
120 {
121 int curSideTo = road_to[curid][side];
122 if(!haveGo[curSideTo] && value_heap[heap_clue[curSideTo]]>value_heap[heap_clue[curid]]+road_cost[curid][side])
123 {
124 value_heap[heap_clue[curSideTo]] = value_heap[heap_clue[curid]]+road_cost[curid][side];
125 heap_up(heap_clue[curSideTo]);
126 }
127 }
128 }
129 for(int i = 0;i<p;++i)
130 {
131 res[i]+=value_heap[heap_clue[i]];
132 }
133 }
134
135 int tempMin = MAXINT;
136 for(int i = 0;i<p;++i)
137 {
138 if(res[i]<tempMin)
139 {
140 tempMin = res[i];
141 }
142 }
143 fprintf(fout,"%d\n",tempMin);
144 fclose(fin);
145 fclose(fout);
146 return 0;
147 }

浙公网安备 33010602011771号