Cod sursa(job #396343)

Utilizator dudu77tTudor Morar dudu77t Data 15 februarie 2010 00:01:21
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.55 kb
#include <fstream>
#include <vector>
#include <iostream>
#include <queue>
#include <stack>

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

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

int n, m;
vector<int> *vecin;
vector<int> *arborePartial;
vector<bool> vizitat;
stack< pair<int, int> > muchii;

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

int main() {
   read();
   
   vizitat.resize(n + m + 1, false);

   DFS(1);

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

   vizitat.assign(n + m + 1, false);
   write();
/*
   for (int i = 1; i < n + m + 1; ++i) {
      cout << "\nVecinii lui " << i << ": ";
      vector<int>::iterator it = arborePartial[i].begin();
      vector<int>::iterator end = arborePartial[i].end();
      for (; it != end; ++it)
         cout << *it << ' ';
   }
*/}

void write() {
   ofstream fout(outFile);

   while (!muchii.empty()) {
      pair<int, int> muchie = muchii.top();
      muchii.pop();
      if (!vizitat[muchie.first] && !vizitat[muchie.second]) {
         vizitat[muchie.first] = true;
         vizitat[muchie.second] = true;
	 muchie = refaMuchie(muchie);
         fout << muchie.first << ' ' << muchie.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() {
   queue<int> deVizitat;
   deVizitat.push(1);
   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(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();
}