您的位置:首页 > 其它

zoj2048//POJ 1751 最小生成树Prim算法实现

2012-04-19 17:07 706 查看
View Code

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define N 760
#define Maxint 99999999

double lowcost
, c

;
double x
, y
;
int towns, m, s
, closest
,path

;

double distance(int i,int  j)//用double为了防止int数据存不下
{
return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}

void Prim()
{
int i,j,k;
double min;
for(i=2; i<=towns; i++)
{
lowcost[i] = c[1][i];
closest[i] = 1;
}
for(i=1; i<towns; i++)
{
min = Maxint;
j = 1;
for(k=2; k<=towns; k++)
{
if((lowcost[k]<min) && (!s[k]))
{
min = lowcost[k];
j = k;
}
}
s[j] = 1;
lowcost[j] = min;//这个一开始忘了加WA了几次,将lowcost最小值更新为已求出的min
for(k=2; k<=towns; k++)
{
if((c[j][k] < lowcost[k]) && (!s[k]))
{
lowcost[k] = c[j][k];
closest[k] = j;
}
}
}
}

int main()
{
int i, j, a, b, k,ncases;

scanf("%d",&ncases);
while( ncases-- )
{
scanf("%d",&towns);
for(i=1; i<=towns; i++)
{
scanf("%lf%lf",&x[i],&y[i]);
}
memset(s,0,sizeof(s));
for(i=1; i<=towns; i++)
for(j=1; j<=towns; j++)
{
c[i][j] =  distance(i,j);//求出任意两点间的距离
}

scanf("%d",&m);
for(i=1; i<=m; i++)
{
scanf("%d%d",&a,&b);
c[a][b] = c[b][a] = 0;//设置成0为了下面查找时方便排除
}
Prim();
for(i=1; i<=towns; i++)
{
if( c[i][closest[i]] )
printf("%d %d\n",i,closest[i]);
}
if(ncases) printf("\n");
}
// system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: