1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<string.h>
4 #define N 760
5 #define Maxint 99999999
6
7 double lowcost[N], c[N][N];
8 double x[N], y[N];
9 int towns, m, s[N], closest[N],path[N][N];
10
11 double distance(int i,int j)//用double为了防止int数据存不下
12 {
13 return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);
14 }
15
16 void Prim()
17 {
18 int i,j,k;
19 double min;
20 for(i=2; i<=towns; i++)
21 {
22 lowcost[i] = c[1][i];
23 closest[i] = 1;
24 }
25 for(i=1; i<towns; i++)
26 {
27 min = Maxint;
28 j = 1;
29 for(k=2; k<=towns; k++)
30 {
31 if((lowcost[k]<min) && (!s[k]))
32 {
33 min = lowcost[k];
34 j = k;
35 }
36 }
37 s[j] = 1;
38 lowcost[j] = min;//这个一开始忘了加WA了几次,将lowcost最小值更新为已求出的min
39 for(k=2; k<=towns; k++)
40 {
41 if((c[j][k] < lowcost[k]) && (!s[k]))
42 {
43 lowcost[k] = c[j][k];
44 closest[k] = j;
45 }
46 }
47 }
48 }
49
50 int main()
51 {
52 int i, j, a, b, k,ncases;
53
54 scanf("%d",&ncases);
55 while( ncases-- )
56 {
57 scanf("%d",&towns);
58 for(i=1; i<=towns; i++)
59 {
60 scanf("%lf%lf",&x[i],&y[i]);
61 }
62 memset(s,0,sizeof(s));
63 for(i=1; i<=towns; i++)
64 for(j=1; j<=towns; j++)
65 {
66 c[i][j] = distance(i,j);//求出任意两点间的距离
67 }
68
69 scanf("%d",&m);
70 for(i=1; i<=m; i++)
71 {
72 scanf("%d%d",&a,&b);
73 c[a][b] = c[b][a] = 0;//设置成0为了下面查找时方便排除
74 }
75 Prim();
76 for(i=1; i<=towns; i++)
77 {
78 if( c[i][closest[i]] )
79 printf("%d %d\n",i,closest[i]);
80 }
81 if(ncases) printf("\n");
82 }
83 // system("pause");
84 return 0;
85 }
86
87