Pagini recente » Cod sursa (job #1692292) | Cod sursa (job #1237798) | Cod sursa (job #1614718) | Cod sursa (job #2304568) | Cod sursa (job #870518)
Cod sursa(job #870518)
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
ifstream fin ("cuplaj.in");
ofstream fout("cuplaj.out");
struct muchie{int x,y;};
muchie s[10001];
int n,m;
int s1;
int s2;
vector<int> v[100003];
int t[10003],x[10003];
int sx;
void Read()
{
int x,y;
fin>>s1>>s2>>m;
n=s1+s2;
for(int i=1 ; i<=m ; i++)
{
fin>>x>>y;
v[x].push_back(s1+y);
}
for(int i=1 ; i<=s1 ; i++)
v[0].push_back(i);
n++;
for(int i=1 ; i<= s2 ; i++)
v[i+s1].push_back(n);
}
int bf()
{
int st,dr;
st=dr=1;
memset(t,0,sizeof(t));
memset(x,0,sizeof(x));
x[1]=0;
t[0]=-1;
while(st<=dr)
{
for(int i=0 ; i < v[x[st]].size() ; i++)
{
int j=v[x[st]][i];
if(t[j]==0)
{
x[++dr] = j;
t[j]=x[st];
if(j==n)
return 1;
}
}
st++;
}
return 0;
}
void cuplaj_maxim()
{
while(bf())
{
int j=n;
while(j!=0)
{
for(int i=0 ; i< v[t[j]].size() ; i++ )
if(v[t[j]][i] == j) v[t[j]].erase(v[t[j]].begin() + i);
v[j].push_back(t[j]);
j = t[j];
}
}
}
int main()
{
Read();
cuplaj_maxim();
sx=0;
for(int i=0 ; i < v[n].size() ; i++ )
s[++sx].y = v[n][i];
for(int i=1 ; i<=sx ; i++)
for(int j=0 ; j < v[s[i].y].size() ; j++ )
s[i].x = v[s[i].y][j];
fout<<sx<<"/n";
for(int i=1 ; i<=sx ; i++)
fout<<s[i].x<< " "<<s[i].y - s1<<"/n";
fin.close();
fout.close();
}