Pagini recente » Cod sursa (job #1547386) | Cod sursa (job #2202676) | Cod sursa (job #763726) | Cod sursa (job #698166) | Cod sursa (job #396343)
Cod sursa(job #396343)
#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();
}