Cod sursa(job #396832)

Utilizator dudu77tTudor Morar dudu77t Data 15 februarie 2010 22:20:32
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.84 kb
#include <fstream>
#include <queue>
#include <vector>

using std::ifstream;
using std::make_pair;
using std::ofstream;
using std::pair;
using std::queue;
using std::vector;

const char inFile [] = "cuplaj.in";
const char outFile [] = "cuplaj.out";

int n, m;
int cuplajMaxim = 0;
vector<int> *vecin;
vector<int> *arborePartial;
vector<bool> vizitat;
vector< pair<int, int> > muchii;
vector< pair<int, int> > muchiiDeAfisat;

void read();
void DFS(int);
void BFS(int);
void write();
pair<int, int> refaMuchie(pair<int, int>);

int main() {
   vector<int> radacini;
   read();
   
   vizitat.resize(n + m + 1, false);
   for (int i = 1; i <= n + m; ++i)
      if (!vizitat[i]) {
         DFS(i);
         radacini.push_back(i);
      }

   vizitat.assign(n + m + 1, false);
   vector<int>::iterator i = radacini.begin();
   vector<int>::iterator end = radacini.end();
   for (; i != end; ++i) {
      BFS(*i);
      printf("%d\n", *i);
   }

   vizitat.assign(n + m + 1, false);
   write();
}

void write() {
   while (!muchii.empty()) {
      pair<int, int> muchie = muchii.back();
      muchii.pop_back();
      if (!vizitat[muchie.first] && !vizitat[muchie.second]) {
         vizitat[muchie.first] = true;
         vizitat[muchie.second] = true;
         muchiiDeAfisat.push_back(refaMuchie(muchie));
         ++cuplajMaxim;
      }
   }

   ofstream fout(outFile);
   fout << cuplajMaxim << '\n';
   vector< pair<int, int> >::iterator i = muchiiDeAfisat.begin();
   vector< pair<int, int> >::iterator end = muchiiDeAfisat.end();
   for (; i != end; ++i)
      fout << i->first << ' ' << i->second << '\n';
   fout.close();
}

pair<int, int> refaMuchie(pair<int, int> muchie) {
   if (muchie.first > muchie.second) {
      int temp = muchie.first;
      muchie.first = muchie.second;
      muchie.second = temp;
   }
   muchie.second -= n;
   return muchie;
}

void BFS(int start) {
   queue<int> deVizitat;
   deVizitat.push(start);
   while (!deVizitat.empty()) {
      int nod = deVizitat.front();
      deVizitat.pop();
      vizitat[nod] = true;
      vector<int>::iterator i = arborePartial[nod].begin();
      vector<int>::iterator end = arborePartial[nod].end();
      for (; i != end; ++i)
         if (!vizitat[*i]) {
             deVizitat.push(*i);
             muchii.push_back(make_pair(nod, *i));
         }
   }
}

void DFS(int nod) {
   vizitat[nod] = true;
   vector<int>::iterator i = vecin[nod].begin();
   vector<int>::iterator end = vecin[nod].end();
   for (; i != end; ++i) {
      if (!vizitat[*i]) {
          arborePartial[nod].push_back(*i);
          DFS(*i);
      }
   }
}

void read() {
   int a, b, e;
   ifstream fin(inFile);
   fin >> n >> m >> e;
   vecin = new vector<int> [n + m + 1];
   arborePartial = new vector<int> [n + m + 1];

   for (; e; --e) {
      fin >> a >> b;
      vecin[a].push_back(b + n);
      vecin[b + n].push_back(a);
   }

   fin.close();
}