Cod sursa(job #2267854)

Utilizator LucaSeriSeritan Luca LucaSeri Data 24 octombrie 2018 09:17:49
Problema Parcurgere DFS - componente conexe Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.08 kb
#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();
    }

}