您的位置:首页 > 其它

POJ-1258 最小生成树

2012-04-17 22:55 330 查看
用了一下PRIM+二叉堆,开始时竟然和DIJKSTRA混了。

/*
* hdu
* mike-w
* 2012-4-17
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_SIZE 512
#define HEAP_SIZE 12345

#ifndef true
#define true 1
#endif

typedef struct _node
{
int id,dst;
}node;

int f[MAX_SIZE][MAX_SIZE];
int tag[MAX_SIZE];
int N;
node heap[HEAP_SIZE];
int heap_size;

int swap(node* e1, node *e2)
{
node tmp;
memmove(&tmp,e1,sizeof(node));
memmove(e1,e2,sizeof(node));
memmove(e2,&tmp,sizeof(node));
return 0;
}

int heap_in(int id, int dist)
{
if(heap_size==HEAP_SIZE)
return -1;
heap_size++;
heap[heap_size].id=id;
heap[heap_size].dst=dist;
int x=heap_size;
int p=x/2;
while(p>0 && heap[p].dst>heap[x].dst)
swap(heap+p,heap+x),x=p,p/=2;
return 0;
}

int heap_out(int *id, int *dist)
{
if(heap_size==0)
return -1;
*id=heap[1].id;
*dist=heap[1].dst;
swap(heap+1,heap+heap_size);
heap_size--;
int p=1,x;
int lc,rc;
while(true)
{
lc=2*p;
rc=2*p+1;
x=p;
if(lc<=heap_size && heap[lc].dst<heap[x].dst)
x=lc;
if(rc<=heap_size && heap[rc].dst<heap[x].dst)
x=rc;
if(x==p)
break;
swap(heap+x,heap+p);
p=x;
}
return 0;
}

int prim(int source)
{
memset(tag,0,sizeof(tag));
heap_size=0;
heap_in(source,0);
int cost=0;
int x,d,i;
while(heap_out(&x,&d)!=-1)
{
if(tag[x])
continue;
tag[x]=1;
cost+=d;
for(i=0;i<N;i++)
if(!tag[i])
heap_in(i,f[x][i]);
}
return cost;
}

int main(void)
{
#ifndef ONLINE_JUDGE
freopen("in","r",stdin);
#endif
int i,j,cost,tmp;
while(scanf("%d",&N)!=EOF)
{
for(i=0;i<N;i++)
for(j=0;j<N;j++)
scanf("%d",f[i]+j);
cost=99999999;
for(i=0;i<1;i++)
{
tmp=prim(i);
if(tmp<cost)
cost=tmp;
}
printf("%d\n",cost);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  struct ini dst