Pagini recente » Cod sursa (job #2227433) | Cod sursa (job #258532) | Cod sursa (job #1661260) | Cod sursa (job #1305525) | Cod sursa (job #1549432)
#include <fstream>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#define N 4000
#define cin fin
int n;
int l[2*N]; //l[i]=nr de vecninii lui i
int v[N][N]; //v[i][j]=al j-lea vecin
int na;//cate noduri sunt in partea stanga
int c[2*N]; //c[i]=-1, daca i nu este cuplat
//c[i]=j, daca este cuplat cu nodul j
int viz[2*N];
int nb,m;
void initializare_c(int c[2*N],int n,int ini)
{
int i;
for(i=0; i<n; i++)
c[i]=ini;
}
int dfs(int i)
{
viz[i]=1;
int j;
for(j=1; j<=l[i]; j++)
{
int k=v[i][j];
if(viz[k]||c[i]==k) continue;
if(c[k]==-1)
{
c[k]=i;
c[i]=k;
viz[k]=1;
return 1;
}
else
{
viz[k]=1;
if(dfs(c[k]))
{
c[i]=k;
c[k]=i;
return 1;
}
else continue;
}
}
return 0;
}
int i;
void greedy()
{
int i,j;
for(i=0;i<na;i++)
{
if(l[i]!=0)
for(j=1;j<=l[i];j++)
if(c[i]==-1&&c[v[i][j]]==-1)
{
viz[i]=1;
viz[v[i][j]]=1;
c[i]=v[i][j];
c[v[i][j]]=i;
break;
}
}
}
int main()
{
cin>>na>>nb>>m;
int x,y;
n=na+nb;
for(i=1; i<=m; i++)
{
cin>>x>>y;
x--;
y--;
y=y+na;
l[x]++;
l[y]++;
v[x][l[x]]=y;
v[y][l[y]]=x;
}
initializare_c(c,n,-1);
greedy();
int ok=1;
while(ok)
{
ok=0;
initializare_c(viz,n,0);
for(i=0; i<na; ++i)
if(!viz[i]&&c[i]==-1)
if(dfs(i))
ok=1;
}
int contor=0;
for(i=0;i<na;i++)
{
if(c[i]!=-1)
{
contor++;
}
}
fout<<contor<<endl;
for(i=0;i<na;i++)
{
if(c[i]!=-1)
{
fout<<i+1<<' '<<c[i]-na+1<<endl;
}
}
return 0;
}