Prim
#include<cstdio>
#include<cmath>
#include<cstring>
const int N = 1010, INF = 2e9;
int book[N],x[N],y[N],p[N];
double e[N][N],dis[N];
int n,m;
void prim()
{
memset(book,0,sizeof book);
for(int i=1;i<=n;i++) dis[i]=e[1][i],p[i]=1;
book[1]=1;
for(int i=1;i<=n-1;i++)
{
double minn=INF;int u;
for(int j=1;j<=n;j++)
{
if(!book[j]&&minn>dis[j])
{
u=j;
minn=dis[j];
}
}
book[u]=1;
for(int j=1;j<=n;j++)
{
if(!book[j]&&dis[j]>e[u][j])
{
dis[j]=e[u][j];
p[j]=u;
}
}
}
for(int i=1;i<=n;i++)
if(e[i][p[i]]!=0)
printf("%d %d\n",p[i],i);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
memset(e,0,sizeof e);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
e[i][j]=e[j][i]=(double)sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
scanf("%d",&m);
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
e[a][b]=e[b][a]=0;
}
prim();
return 0;
}
kruskal
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1010;
struct note
{
int u,v;double w;
}e[N*N];
int x[N],y[N],f[N],a[N],b[N];
int n,m,k;
bool cmp(note a,note b)
{
return a.w<b.w;
}
int find(int x)
{
if(f[x]==x) return x;
else return f[x]=find(f[x]);
}
int merge(int v,int u)
{
int t1,t2;
t1=find(u);
t2=find(v);
if(t1!=t2)
{
f[t1]=t2;
return 1;
}
return 0;
}
void kruskal()
{
int cut=0;
for(int i=1;i<=k;i++)
{
if(merge(e[i].u,e[i].v))
{
a[cut]=e[i].u;
b[cut]=e[i].v;
cut++;
}
if(cut==n-1)
break;
}
for(int i=0;i<cut;i++)
printf("%d %d\n",a[i],b[i]);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
k=1;
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
{
e[k].u=i;
e[k].v=j;
e[k++].w=(double)sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}
k--;
sort(e+1,e+k+1,cmp);
for(int i=0;i<=n;i++) f[i]=i;
scanf("%d",&m);
while(m--)
{
int a,b;
scanf("%d%d",&a,&b);
int x=find(a);
int y=find(b);
if(x!=y) f[x]=y;
}
kruskal();
return 0;
}