Cod sursa(job #2709145)

Utilizator isa_tudor_andreiAndrei Tudor isa_tudor_andrei Data 19 februarie 2021 19:51:40
Problema Felinare Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include<bits/stdc++.h>

using namespace std;

const int MAX_N = 20001;

ifstream fin( "felinare.in" );
ofstream fout( "felinare.out" );

vector<int> edges[MAX_N];
int p[MAX_N], ans[MAX_N];
bool viz[MAX_N];

int n, m, e;

bool dfs( int u ) {
  viz[u] = 1;

  for( int v : edges[u] )
    if( !p[v] ) {
      p[v] = u;
      p[u] = v;
      return 1;
    }

  for( int v : edges[u] ) {
    if( viz[v] )
      continue;

    viz[v] = 1;
    if( dfs( p[v] ) ) {
      p[v] = u;
      p[u] = v;
      return 1;
    }
  }

  return 0;
}

int main() {

  fin>>n>>e;

  for( int i = 0; i < e; i++ ) {
    int a, b;
    fin>>a>>b;
    b += n;

    edges[a].push_back( b );
    edges[b].push_back( a );
  }

  int cnt = 0;
  bool g = true;
  while( g ) {
    for( int i = 1; i <= n + n; i++ )
      viz[i] = 0;

    g = 0;
    for( int i = 1; i <= n; i++ ) {
      if( viz[i] || p[i] )
        continue;
      if( dfs( i ) ) {
        g = 1;
        cnt++;
      }
    }
  }

  memset(viz, 0, sizeof(viz));
  fout<<2*n - cnt<<"\n";

  for( int i = 1; i <= n + n; i++ ) {
    if( !p[i] ) {
      viz[i] = 1;
      ans[i] += (i > n) ? 2:1;
    }
  }
  for( int i = 1; i <= n + n; i ++ ) {
    if( !viz[i] ) {
      bool flag = true;
      for( const auto &it : edges[i] ) {
        if( viz[it] == 1 )
          flag = false;
      }
      if( flag == true ) {
        ans[i] += (i > n) ? 2:1;
        viz[i] = true;
        viz[p[i]] = true;
      }
    }
  }
  for( int i = 1; i <= n; i ++ )
    fout<<ans[i] + ans[i + n]<<"\n";
  return 0;
}