题意:给一个坐标图,求最小生成树。
题解:题目比较裸。注意节点的序号
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
int px[755],py[755];
int n,m,tot;
struct node{
int u,v,w;
}e[500000];
int p[755];
queue<node>que;
int finde(int x){
if(p[x]==x)return x;
return p[x]=finde(p[x]);
}
void unit(int x,int y){
x=finde(x);
y=finde(y);
if(x==y)return ;
p[x]=y;
}
bool check(int x,int y){
x=finde(x);
y=finde(y);
if(x==y)return true;
return false;
}
void init(){
int i;
for(i=0;i<=n;i++)p[i]=i;
while(!que.empty())que.pop();
tot=0;
}
int cmp(node a,node b){
return a.w<b.w;
}
void kriskal(){
int i;
bool flag;
node edge;
sort(e,e+tot,cmp);
for(i=0;i<tot;i++){
edge=e[i];
flag=check(edge.u,edge.v);
if(flag)continue;
unit(edge.u,edge.v);
if(edge.w!=0)printf("%d %d\n",edge.u+1,edge.v+1);
}
return ;
}
int main()
{
int i,j;
scanf("%d",&n);
init();
for(i=0;i<n;i++)scanf("%d%d",&px[i],&py[i]);
for(i=0;i<n;i++)
for(j=0;j<i;j++){
//if(i==j)continue;
e[tot].u=i;
e[tot].v=j;
e[tot].w=(px[i]-px[j])*(px[i]-px[j])+(py[i]-py[j])*(py[i]-py[j]);
tot++;
}
scanf("%d",&m);
while(m--){
scanf("%d%d",&i,&j);
i--,j--;
unit(i,j);
}
kriskal();
// cout << "Hello world!" << endl;
return 0;
}
吐槽一下……用!=EOF读入会超时。