Pagini recente » Cod sursa (job #1808937) | Cod sursa (job #2573022) | Cod sursa (job #2884538) | Cod sursa (job #921906) | Cod sursa (job #2267854)
#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define sz(x) (int)((x).size())
#define all(x) (x).begin(),(x).end()
#define FO(x) {freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);}
using edge = pair< double, pair< int, int > >;
const int MAXN = 2010;
edge edges[MAXN*MAXN];
pair< int, int > p[MAXN];
vector< int > gr[MAXN];
int t[MAXN];
int card[MAXN];
vector< pair< int, int > > moves[MAXN];
double dist(int i, int j) {
return sqrt(1.0*(p[i].first - p[j].first) * 1.0*(p[i].first - p[j].first) + 1.0*(p[i].second - p[j].second)*1.0*(p[i].second - p[j].second));
}
int root(int x) {
if(x == t[x]) return x;
return t[x] = root(t[x]);
}
void unite(int x, int y) {
if(card[x] < card[y]) swap(x, y);
t[y] = x;
card[x] += card[y];
}
int n;
int d(int a, int b) {
if(a > b) swap(a, b);
return min(a + n-b, b - a);
}
void dfs(int node, int boss) {
sort(all(gr[node]), [&](int i, int j) -> bool {
return d(node, i) < d(node, j);
});
for(auto &x : gr[node]) {
if(x == boss) continue;
dfs(x, node);
printf("%d %d\n", x, node);
}
}
int o;
void solve() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d%d", &p[i].first, &p[i].second);
//gr[i+1].clear();
t[i+1] = i + 1;
card[i+1] = 1;
}
for(int i = 0; i < n; ++i) {
for(int j = 0; j < n; ++j) {
edges[n*i+j] = mp(dist(i, j), mp(i + 1, j + 1));
}
}
sort(edges, edges + n*n);
double ans = 0;
for(int i = 0; i < n*n; ++i) {
if(root(edges[i].second.first) != root(edges[i].second.second)) {
unite(root(edges[i].second.first), root(edges[i].second.second));
gr[edges[i].second.first].emplace_back(edges[i].second.second);
gr[edges[i].second.second].emplace_back(edges[i].second.first);
ans += edges[i].first;
}
}
if(o == 1) {
printf("%.12f\n", ans);
return ;
}
dfs(1, 0);
}
int main() {
FO(poligon7);
scanf("%d", &o);
int t;
scanf("%d", &t);
while(t--) {
solve();
}
}