Pagini recente » Cod sursa (job #3233483) | Cod sursa (job #517658) | Cod sursa (job #467722) | Cod sursa (job #2192599) | Cod sursa (job #396832)
Cod sursa(job #396832)
#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();
}