给出结点的坐标 以及已建好的边 要输出MST中加入的边(已建好的边就不用输出了)
结点的编号从1开始
注意这题只有一组数据 不能用多组输入 否则就超时(在这被坑惨了Orz)
Sample Input
9
1 5
0 0
3 2
4 5
5 1
0 4
5 2
1 2
5 3
3
1 3
9 7
1 2
Sample Output
1 6
3 7
4 9
5 7
8 3
# include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <cmath>
# define LL long long
using namespace std ; const int INF=0x3f3f3f3f;
const int MAXN=;
bool vis[MAXN];
double lowc[MAXN];
int n ;
double cost[MAXN][MAXN] ;
int pre[MAXN] ; struct poin
{
int x ;
int y ;
}p[MAXN]; void Prim()
{
memset(vis,false,sizeof(vis));
vis[]=true;
for(int i=;i<=n;i++)
{
lowc[i]=cost[][i];
pre[i] = ;
} for(int i=;i<=n;i++)
{
double minc=INF;
int p=-;
for(int j=;j<=n;j++)
if(!vis[j]&&minc>lowc[j])
{
minc=lowc[j];
p=j;
}
if(minc != )
{
printf("%d %d\n",pre[p],p);
}
if (p == -)
return ;
vis[p]=true;
for(int j=;j<=n;j++)
if(!vis[j]&&lowc[j]>cost[p][j])
{
lowc[j]=cost[p][j];
pre[j]=p;
}
}
return ;
} int main()
{ //freopen("in.txt","r",stdin) ;
scanf("%d" , &n) ;
int i , j ;
for (i = ; i <= n ; i++)
scanf("%d %d" , &p[i].x , &p[i].y) ;
for (i = ; i <= n ; i++)
{
cost[i][i] = INF ;
for (j = i+ ; j <= n ; j++)
{
double t = sqrt((double)(p[i].x - p[j].x) * (p[i].x - p[j].x) + (p[i].y - p[j].y) * (p[i].y - p[j].y)) ;
cost[i][j] = t ;
cost[j][i] = t ;
}
} int m , u , v ;
scanf("%d" , &m) ;
while(m--)
{
scanf("%d %d" , &u , &v) ;
cost[u][v] = ;
cost[v][u] = ;
}
Prim() ; return ;
}