Pagini recente » Cod sursa (job #396123) | Cod sursa (job #1426073) | Cod sursa (job #2541767) | Cod sursa (job #930373) | Cod sursa (job #396359)
Cod sursa(job #396359)
#include <fstream>
#include <vector>
#include <iostream>
#include <queue>
using std::ifstream;
using std::ofstream;
using std::vector;
using std::cout;
using std::queue;
using std::pair;
using std::make_pair;
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();
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();
}
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() {
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_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();
}