题解 最小生成树 POJ 1751
题意:给N和N个城市的坐标,M个两个城市间已搭建的桥,求用最少的距离搭桥使N个城市连接在一起。
做法:用prim最小生成树,和并查集。将每个节点的父亲节点记录下来用于输出。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#define INF 0xFFFFFF
using namespace std;
struct xoy{int x, y;};
const int MAX=10000;
int v[MAX],a[MAX][MAX],dis[MAX];
xoy dot[MAX];
int n,m;
void prim()
{
v[1]=1;
int i,in[MAX];
for(i=1;i<=n;i++)
{
dis[i]=a[1][i];
in[i]=1;
}
for(int k=1;k<n;k++)
{
int minn=INF;
int point=0;
for(i=1;i<=n;i++)
{
if((!v[i])&&dis[i]<minn)
{
minn=dis[i],point=i;
}
}
if(minn!=0)
printf("%d %d\n",point,in[point]);
v[point]=1;
dis[point]=INF;
if(point!=0)
{
for(i=1;i<=n;i++)
if(!v[i]&&dis[i]>a[point][i])
{dis[i]=a[point][i];in[i]=point;}
}
}
}
int main()
{
int x,y,i,j;
memset(v,0,sizeof(v));
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&dot[i].x,&dot[i].y);
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
a[i][j]=(dot[i].x-dot[j].x)*(dot[i].x-dot[j].x)+(dot[i].y-dot[j].y)*(dot[i].y-dot[j].y);
}
}
scanf("%d",&m);
for(i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
a[x][y]=a[y][x]=0;
}
prim();
return 0;
}
错误:WA 设置INF过小
浙公网安备 33010602011771号