Pagini recente » Cod sursa (job #1839064) | Cod sursa (job #1384545) | Cod sursa (job #1264238) | Cod sursa (job #916914) | Cod sursa (job #1549693)
#include <fstream>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
#define N 20000
#define cin fin
struct nod
{
int info;
nod *next=NULL;
} v[N];
nod *prezent[N];
int n;
int l[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[N]; //c[i]=-1, daca i nu este cuplat
//c[i]=j, daca este cuplat cu nodul j
int viz[N];
int nb,m;
void initializare_c(int c[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;
nod *q;
q=&v[i];
for(j=1; j<=l[i]; j++)
{
int k=q->info;
q=q->next;
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;
struct nod1
{
int x,y;
nod1 *next;
};
void greedy()
{
int i,j;
nod *q;
for(i=0; i<na; i++)
{
if(l[i]!=0)
{
q=&v[i];
while(q!=NULL)
{
if(c[i]==-1&&c[q->info]==-1)
{
viz[i]=1;
viz[q->info]=1;
c[i]=q->info;
c[q->info]=i;
break;
}
else q=q->next;
}
}
}
}
int main()
{
cin>>na>>nb>>m;
int x,y;
n=na+nb;
nod *q;
for(i=1; i<=m; i++)
{
cin>>x>>y;
x--;
y--;
y=y+na;
l[x]++;
l[y]++;
if(prezent[x]==NULL)
{
prezent[x]=&v[x];
prezent[x]->info=y;
prezent[x]->next=NULL;
}
else
{
q=new nod();
q->info=y;
q->next=NULL;
prezent[x]->next=q;
prezent[x]=q;
}
if(prezent[y]==NULL)
{
prezent[y]=&v[y];
prezent[y]->info=x;
prezent[y]->next=NULL;
}
else
{
q=new nod();
q->info=x;
q->next=NULL;
prezent[y]->next=q;
prezent[y]=q;
}
}
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;
nod1 *qq;
nod1 *ls;
nod1 *prez;
prez=new nod1();
ls=prez;
qq=ls;
for(i=0; i<na; i++)
{
if(c[i]!=-1)
{
contor++;
qq->x=i+1;
qq->y=c[i]-na+1;
qq=new nod1();
qq->next=NULL;
prez->next=qq;
prez=qq;
}
}
fout<<contor<<endl;
while(ls->next!=NULL)
{
fout<<ls->x<<' '<<ls->y<<endl;
ls=ls->next;
}
return 0;
}