Pagini recente » Cod sursa (job #1677807) | Cod sursa (job #311778) | Cod sursa (job #1156071) | Cod sursa (job #976294) | Cod sursa (job #863978)
Cod sursa(job #863978)
#include<fstream>
#include<cstring>
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
struct muchie {int x,y;};
int C[10001][10001];//matricea costurilor
int t1,t2,n;//cardinalele si nr total de noduri
int T[10001],X[10001];//vector TATA din BFS, coada din BFS
muchie S[10001];//solutia
int sk;//lungimea solutiei
int gasit;
void DFS(int k) //returneaza 1 daca gaseste drum de crestere de la 0 la n
{
if(k==n) { gasit=1; return ;}
for(int i=0;i<=n;i++)
if(!T[i] && C[k][i]>0)
{
T[i]=k;
DFS(i);
}
}
int PDFS()
{
gasit=0;
DFS(0);
if(gasit==1) return 1;
else return 0;
}
void cuplaj_maxim()
{
int j;
T[0]=-1;
while(PDFS())//cat timp mai gaseste drumuri de crestere
{
j=n;
while(j!=0)//inverseaza arcele
{ C[T[j]][j]=0;
C[j][T[j]]=1;
j=T[j];
}
memset(T,0,sizeof(T));
}
}
void afism()
{
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++) fout<<C[i][j]<<" ";
fout<<endl;
}
}
int main()
{
int i,x,y,m;
fin>>t1>>t2>>m;
n=t1+t2;
for(i=1;i<=m;++i)
{
fin>>x>>y;
C[x][t1+y]=1;
}
for(i=1;i<=t1;i++) C[0][i]=1;
n++;
for(i=1;i<=t2;i++) C[t1+i][n]=1;
cuplaj_maxim();
//afism();
for(i=1;i<=n;i++)
if(C[n][i]==1) S[++sk].y=i;
for(i=1;i<=sk;i++)
for(int j=1;j<=n;j++)
if(C[S[i].y][j]) S[i].x=j;
fout<<sk<<endl;
for(i=1;i<=sk;i++) fout<<S[i].x<<" "<<S[i].y-t1<<endl;
return 0;
}