Cod sursa(job #3215657)

Utilizator heheboi6Budiul Alexandru Vasile heheboi6 Data 15 martie 2024 11:20:31
Problema Cuplaj maxim in graf bipartit Scor 30
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include<fstream>
#include<stdio.h>
#include<vector>
#include<queue>
#include <cstring>
using namespace std;
int n,c[1000][1000],flux[1000][1000],tata[1000],viz[1000];
vector <int> N[1000];
ifstream f("cuplaj.in");
ofstream g("cuplaj.out");
int parcurg()
{
	int i,p;
	queue <int> q;
	viz[0]=1;
	q.push(0);
	memset(viz,0,sizeof(viz));
	while(q.size()>0)
	{
		p=q.front();
		for(i=0;i<N[p].size();i++)
			if((viz[N[p][i]]==0)&&(c[p][N[p][i]]>flux[p][N[p][i]]))
			{
				q.push(N[p][i]);
				tata[N[p][i]]=p;
				viz[N[p][i]]=1;
				if(N[p][i]==2*n+1)
					return 1;
			}
		q.pop();
	}
	return 0;
}
int main()
{
	int l,ok=1,fluxt=0,i,j,k,nod,fmin1,card1,card2,m;
	f >> card1 >> card2 >> m;
	n=card1+card2;
	for(l=1;l<=m;l++){
		f >> k >> j;
        c[k][j+n]=1;
        c[j+n][k]=0;
        N[k].push_back(j+n);
        N[j+n].push_back(k);
	}
	for(i=1;i<=n;i++)
	{
		c[0][i]=1;
		c[i][0]=0;
		N[0].push_back(i);
		N[i].push_back(0);
	}
	for(i=1;i<=n;i++)
	{
		c[i+n][2*n+1]=1;
		c[2*n+1][i+n]=0;
		N[i+n].push_back(2*n+1);
		N[2*n+1].push_back(i+n);
	}
	while(ok)
	{
		ok=parcurg();
		fmin1=100000;
		for(nod=2*n+1;nod!=0;nod=tata[nod])
			fmin1=min(fmin1,c[tata[nod]][nod]-flux[tata[nod]][nod]);
		for(nod=2*n+1;nod!=0;nod=tata[nod])
		{
			flux[tata[nod]][nod]+=fmin1;
			flux[nod][tata[nod]]-=fmin1;
		}
		fluxt+=fmin1;
	}
	g << fluxt << '\n';
	for(i=1;i<=n;i++){
		for(j=1;j<=2*n;j++){
			if(flux[i][j]!=0){
				g << i << " " << j-n << '\n';
			}
        }
	}
}