Pagini recente » Cod sursa (job #2242271) | Cod sursa (job #2274890) | La capatul lumii | Cod sursa (job #2703684) | Cod sursa (job #2423544)
#include <iostream>
#include <cstdio>
#include <vector>
#include <deque>
using namespace std;
vector<vector<int> > Graph(20001);
int Pair[20001], Count[20001], i, j, N, M, E, rev, Past[20001], aug, k, Source[20001];
bool Check[20001];
deque<int> Q;
vector<pair<int, int> > Sol, Out;
int main()
{
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
scanf("%d%d%d", &N, &M, &E);
if(N>M){rev=1; swap(N, M);}
for(i=1; i<=N+M; ++i) Graph[i].push_back(0);
for(i=1; i<=E; ++i){
int x, y;
scanf("%d%d", &x, &y);
if(rev==1) swap(x, y);
++Graph[x][0];
Graph[x].push_back(y+N);
}
aug=1;
while(aug!=0){
aug=0;
while(!Q.empty()) Q.pop_front();
for(i=1; i<=N+M; ++i) {if(i>N)Check[i]=false; Past[i]=Source[i]=0;}
for(i=1; i<=N; ++i) if(Check[i]==false) Q.push_back(i);
while(!Q.empty()){
int i=Q.front(); Q.pop_front();
if(Check[Source[i]]==true) continue;
for(j=1; j<=Graph[i][0]; ++j){
if(Check[Graph[i][j]]==false){
Check[Graph[i][j]]=true;
if(Pair[Graph[i][j]]==0){
Past[Graph[i][j]]=i;
if(Source[i]!=0)Source[Graph[i][j]]=Source[i]; else Source[Graph[i][j]]=i;
int x=Graph[i][j], List[20001], V=0;
while(x!=0) {List[++V]=x; x=Past[x];}
for(k=V; k>=2; k-=2){Sol.push_back(make_pair(List[k], List[k-1])); ++Count[List[k]]; ++Count[List[k-1]]; Pair[List[k-1]]=List[k];}
++aug; Check[List[V]]=true; break;
}
else{
Past[Graph[i][j]]=i; Past[Pair[Graph[i][j]]]=Graph[i][j]; if(Source[i]!=0)Source[Graph[i][j]]=Source[i]; else Source[Graph[i][j]]=i;
Q.push_back(Pair[Graph[i][j]]);
}
}
}
}
}
for(i=0; i<Sol.size(); ++i) {
--Count[Sol[i].first]; --Count[Sol[i].second];
if(Count[Sol[i].first]==0 && Count[Sol[i].second]==0){
if(Sol[i].first>N) Sol[i].first-=N;
if(Sol[i].second>N) Sol[i].second-=N;
if(rev==1) swap(Sol[i].first, Sol[i].second);
Out.push_back(Sol[i]);
}
}
printf("%d\n", Out.size());
for(i=0; i<Out.size(); ++i) printf("%d %d\n", Out[i].first, Out[i].second);
return 0;
}