Pagini recente » Cod sursa (job #1857011) | Cod sursa (job #6932) | Cod sursa (job #1924284) | Cod sursa (job #2200178) | Cod sursa (job #2466324)
#include <iostream>
#include <stdio.h>
#include <limits.h>
#include <string.h>
#include <vector>
#include <queue>
#include <stack>
#define FOR(vc,it) for( it= vc.begin();it!=vc.end();++it)
#define iter vector<int>::iterator
#define NMX 21000
using namespace std;
int n,m,e;
vector<int> v[NMX];
bool uE[NMX][NMX];
bool uV[NMX];
bool vis[NMX];
int h[NMX];
int p[NMX];
int mat[NMX];
int sum;
int main()
{
freopen("cuplaj.in","r",stdin);
freopen("cuplaj.out","w",stdout);
scanf("%d %d %d",&n,&m,&e);
for(int i=0;i<e;i++)
{
int j,k;
scanf("%d %d",&j,&k);
v[j].push_back(k+n);
v[k+n].push_back(j);
uE[k+n][j]=1;
}
while(true)
{
queue<int> q=queue<int>();
memset(vis,0,n+m+1);
memset(h,0,n+m+1);
for(int i=1;i<=n;i++)
{
if(!uV[i])
{
q.push(i);
vis[i]=1;
}
}
vector<int> vk=vector<int>();
int hk=INT_MAX;
while(!q.empty())
{
int tp =q.front();
// cout<<"tp: "<<tp<<"\n";
vector<int>::iterator it;
FOR(v[tp],it)
if(!vis[*it]&&!uE[tp][*it])
{
vis[*it]=1;
h[*it]=h[tp]+1;
if(*it>n&& !uV[*it])
{
// cout<<*it<<"\n";
hk=h[*it];
vk.push_back(*it);
}
else if(h[*it]<hk)
q.push(*it);
}
q.pop();
}
if(vk.size()==0) break;
iter it;
bool match=0;
FOR(vk,it)
{
stack<int> st=stack<int>();
memset(vis,0,n+m+1);
vis[*it]=1;
st.push(*it);
int found=-1;
while(!st.empty())
{
int tp =st.top();
// cout<<"tp: "<<tp<<"\n";
bool next=0;
iter it2;
FOR(v[tp],it2)
{
if(h[*it2]<h[tp]&&!vis[*it2]&&uE[tp][*it2])
{
// cout<<*it2<<"\n";
vis[*it2]=1;
st.push(*it2);
next=1;
p[*it2]=tp;
if(*it2<=n&& !uV[*it2])
{
// cout<<"found:"<<*it2<<"\n";
found=*it2;
match=1;
break;
}
}
}
if(!next) st.pop();
if(found!=-1) break;
}
if(found==-1) continue;
for(int nod=found;nod!=*it;nod=p[nod])
{
// cout<<p[nod]<<" ";
uE[p[nod]][nod]=!uE[p[nod]][nod];
uE[nod][p[nod]]=!uE[nod][p[nod]];
uV[nod]=1;
uV[p[nod]]=1;
mat[nod]=p[nod];
}
// cout<<"\n";
}
if(!match) break;
}
sum=0;
for(int i=1;i<=n;i++)
if(uV[i]) sum++;
printf("%d\n",sum);
for(int i=1;i<=n;i++)
if(uV[i])
printf("%d %d\n",i,mat[i]-n);
}