Submission #22985

#TimeUsernameProblemLanguageResultExecution timeMemory
22985model_codeNetwork (BOI15_net)C++11
63 / 100
1136 ms64512 KiB
/*/
  Task: net
  Random solution
  With covering edges
  Author: Bartosz Kostka 
/*/

#include "bits/stdc++.h"

using namespace std;

const int MAXN = 500007;

vector <int> L,G[MAXN];
int w, n;

int licz;
int d[MAXN], par[MAXN];
bool vis[MAXN];
map <pair <int, int>, bool> M;

void print(vector <int> &S)
{
  printf("%d\n", (int)S.size()/2);
  for(int i=0; i<(int)S.size(); i+=2)
    printf("%d %d\n", S[i], S[i+1]);
  exit(0);
}

void dfs(int v)
{
  vis[v] = true;
  for(auto w : G[v])
    if(vis[w] == false)
    {
      d[w] = d[v]+1;
      par[w] = v;
      dfs(w);
    }
}

void sset(int a, int b, bool jak)
{
  int x = min(a,b);
  int y = max(a,b);
  M[make_pair(x,y)] = jak;
}

void cover(int a, int b)
{
  if(d[a] < d[b])
    swap(a,b);
  while(d[a] != d[b])
  {
    sset(a,par[a],true);
    a = par[a];
  }
  while(a != b)
  {
    cerr << a << " " << b << "\n";
    cerr << "P" << par[a] << " " << par[b] << "\n";
    sset(a,par[a],true);
    a = par[a];
    sset(b,par[b],true);
    b = par[b];
  }
}

bool bridges()
{
  cerr << "???\n";
  for(auto ele : M)
    if(ele.second == false)
      return true;
  return false;
}

int main()
{
  srand(42);
  scanf("%d", &n);
  if(n==1)
  {
    printf("0\n");
    return 0;
  }
  if(n==2)
  {
    printf("1\n1 2\n");
    return 0;
  }
  for(int i=1; i<n; i++)
  {
    int a, b;
    scanf("%d%d", &a, &b);
    G[a].push_back(b);
    G[b].push_back(a);
    sset(a,b,false);
  }
  for(int i=1; i<=n; i++)
  {
    if((int)G[i].size() == 1)
      L.push_back(i);
    else
      w = i;
  }
  dfs(w);
  if((int)L.size() % 2 == 1)
    L.push_back(w);
  while(true)
  {
    random_shuffle(L.begin(), L.end());
    for(int i=0; i<(int)L.size(); i+=2)
    {
      int a = L[i], b = L[i+1];
      cerr << a << " " << b << "\n";
      cover(a,b);
    }
    if(bridges() == false)
      print(L);
    for(auto& ele : M)
      ele.second = false; 
  } 
}

Compilation message (stderr)

net.cpp: In function 'int main()':
net.cpp:81:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &n);
                  ^
net.cpp:95:26: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &a, &b);
                          ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...