/*
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
题意: 给出N个点的坐标(x,y),然后给出M个已经连通的点(点的编号到点的编号)。 求生成最小生成树,需要再连接那几个点,并且输出。
思路:用邻接矩阵存储点到点的距离,直接prim算法处理;在算法中,记录加入的边;(编程技巧看代码)
*/
#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
using namespace std;
const int INF = 1<<30;
struct point{
int x,y,id;
double c;
};
int map[751][751];
point arr[751];
point temp;
int dis[751];
int vis[751];
int res_a[751];
int res_b[751];
bool cmp(point tmp_1,point tmp_2){
return tmp_1.c > tmp_2.c;
}
void init_map(int p){
for(int i=1; i<=p; ++i){
for(int j=1; j<=p; ++j){
if(i == j){
map[i][j] = INF;
}else{
map[i][j] = INF;
}
}
}
}
void show_map(int p){
for(int i=1; i<=p; ++i){
for(int j=1; j<=p; ++j){
if(map[i][j] == INF){
printf(" *");
}else{
printf("%4d", map[i][j]);
}
}
printf("\n");
}
}
int add(point a,point b){
return (a.x-b.x)*(a.x-b.x) + (a.y-b.y)*(a.y-b.y);
}
void distance(int p){
for(int i=1; i<=p; ++i) {
for(int j=1; j<=p; ++j){
if(map[i][j] == 0){
continue;
}
int temp = add(arr[i], arr[j]);
if(temp < map[i][j]){
map[i][j] = temp;
}
}
}
}
void prim(int local,int p,int m){
int temp,sign, sign_2, cnt = 0;
for(int i=1; i<=p; ++i){
dis[i] = map[local][i];
vis[i] = 0;
}
vis[local] = 1;
for(int i=2; i<=p; ++i){
temp = INF;
sign = -1;
for(int j=1; j<=p; ++j){
if(!vis[j] && temp > dis[j]){
temp = dis[j];
sign = j;
}
}
temp = INF;
sign_2 = -1;
for(int i=1; i<=p; ++i){
if(vis[i] && temp > map[sign][i]){
temp = map[sign][i];
sign_2 = i;
}
}
vis[sign] = 1;
if(map[sign_2][sign] != 0)
printf("%d %d\n", sign_2, sign);
for(int j=1; j<=p; ++j){
if(!vis[j] && dis[j] > map[sign][j]){
dis[j] = map[sign][j];
sign_2 = j;
}
}
res_a[i] = sign_2;
res_b[i] = sign;
}
}
int main(){
// freopen("a.txt", "r", stdin);
int p,m;
int x,y,id,a,b;
while(~scanf("%d", &p) ){
id = 0;
for(int i=1; i<=p; ++i){
scanf("%d %d", &x, &y);
arr[i].id = i;
arr[i].x = x;
arr[i].y = y;
}
scanf("%d", &m);
init_map(p);
for(int i=1; i<=m; ++i){
scanf("%d %d", &a, &b);
map[a][b] = map[b][a] = 0;
}
// show_map(p);
distance(p);
// show_map(p);
prim(1, p, m);
}
return 0;
}