prim算法稍加变化,看代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
using namespace std;
#define maxn 1001
#define inf 0xfffffff
int n; //总点数
int d[maxn][maxn];//村庄图
int v[maxn];//已选标记
int l[maxn];//点到已选点最短路径长度
int p[maxn];
int x[maxn],y[maxn];
void prim()
{
memset(x,0,sizeof(x));//初始化,清零
for(int i=1;i<=n;i++)
{
l[i]=d[1][i];
p[i]=1;
}
v[0]=1;
l[0]=0; //已选(0,0)为起点
for(int i=1;i<=n;i++)
{
int m=inf,temp=0;
for(int j=0;j<=n;j++)
{
if(!v[j]&&m>l[j])
{
m=l[temp=j];
}
}
//l[temp]=0;
v[temp]=1;
if(d[p[temp]][temp]!=0)
{
printf("%d %d\n",temp,p[temp]);
}
for(int j=1;j<=n;j++){
if(!v[j]&&l[j]>d[temp][j])
{
l[j]=d[temp][j];
p[j]=temp;
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d %d",&x[i],&y[i]);
for(int j=1;j<=i;j++)
{
d[i][j]=d[j][i]=(x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
}
}
int m;
scanf("%d",&m);
int a,b;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
d[a][b]=d[b][a]=0;
}
prim();
return 0;
}