您的位置:首页 > 其它

USACO 3.2 Sweet Butter

2011-05-27 21:36 218 查看
这个题时间是个大问题,用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.

/*
PROG: butter
ID: jiafeim1
LANG: C++
*/

#include <stdio.h>
#include <string.h>
#define MAXINT 100000000
int cow_count;
int heap_size;
int value_heap[805];
int id_heap[805];
int heap_clue[805];
int cows[805];

int road_to[805][1455];
int road_cost[805][1455];
int road_count[805]={0};

int res[805]={0};

bool haveGo[805];

void heap_swap(int i ,int j)
{
int temp;
temp = value_heap[i];
value_heap[i]=value_heap[j];
value_heap[j] = temp;

heap_clue[id_heap[i]]=j;
heap_clue[id_heap[j]]=i;

temp = id_heap[i];
id_heap[i]=id_heap[j];
id_heap[j] = temp;
}

void heap_up(int i)
{
while(i>0 && value_heap[i]<value_heap[(i-1)/2])
{
heap_swap(i,(i-1)/2);
i=(i-1)/2;
}
}
void heap_down(int j)
{
bool haveDo;
do
{
haveDo = false;
int left = 2*j+1;
int right = 2*j+2;
if(right<heap_size && value_heap[right]<value_heap[j] && value_heap[right]<value_heap[left])
{
heap_swap(j,right);
j = right;
haveDo = true;
continue;
}
if(left<heap_size && value_heap[left]<value_heap[j])
{
heap_swap(j,left);
j = left;
haveDo = true;
continue;
}
}while(haveDo);
}
int main()
{
FILE *fin = fopen("butter.in", "r");
FILE *fout = fopen("butter.out", "w");

int n,p,c;
fscanf(fin,"%d%d%d",&n,&p,&c);
for(int i = 0;i<n;++i)
{
fscanf(fin,"%d",&(cows[i]));
--cows[i];
}

int t1,t2,tc;
for(int i=0;i<c;++i)
{
fscanf(fin,"%d%d%d",&t1,&t2,&tc);
--t1;
--t2;
road_cost[t1][road_count[t1]]=tc;
road_to[t1][road_count[t1]]=t2;
++road_count[t1];

road_cost[t2][road_count[t2]]=tc;
road_to[t2][road_count[t2]]=t1;
++road_count[t2];
}
for(int co = 0;co<n;++co)
{
int nowCo = cows[co],curid;
heap_size = p;
for(int ba=0;ba<p;++ba)
{
value_heap[ba] = MAXINT;
id_heap[ba] = ba;
heap_clue[ba] = ba;
}
memset(haveGo,false,p*sizeof(bool));
value_heap[nowCo] = 0;
heap_up(nowCo);
for(int ba=0;ba<p;++ba)
{
curid = id_heap[0];
haveGo[curid] = true;
heap_swap(0,heap_size-1);
--heap_size;
heap_down(0);
for(int side = 0;side<road_count[curid];++side)
{
int curSideTo = road_to[curid][side];
if(!haveGo[curSideTo] && value_heap[heap_clue[curSideTo]]>value_heap[heap_clue[curid]]+road_cost[curid][side])
{
value_heap[heap_clue[curSideTo]] = value_heap[heap_clue[curid]]+road_cost[curid][side];
heap_up(heap_clue[curSideTo]);
}
}
}
for(int i = 0;i<p;++i)
{
res[i]+=value_heap[heap_clue[i]];
}
}

int tempMin = MAXINT;
for(int i = 0;i<p;++i)
{
if(res[i]<tempMin)
{
tempMin = res[i];
}
}
fprintf(fout,"%d\n",tempMin);
fclose(fin);
fclose(fout);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: