Cod sursa(job #404639)

Utilizator alex@ndraAlexandra alex@ndra Data 26 februarie 2010 14:36:03
Problema Cuplaj maxim in graf bipartit Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#include <vector>
using namespace std;
int N1,N2,st[1000],dr[1000],nr,M,viz[1000];
vector <int > G[1000];
int cupleaza(int nod)
{
	  int i,vecini;
	if (viz[nod]) return 0;
	viz[nod]=1;
	vecini=G[nod].size();
	for(i=0;i<vecini;i++)
	{
		// if(!G[nod][i]) continue;
		 if (!dr[i+1]||cupleaza(dr[i+1]))
		 {st[nod]=i+1;
		  dr[i+1]=nod;
		  return 1;
		 }
	}
	return 0;
}

void cuplaj()
{
	 int i;
	 for(i=1;i<=N1;i++)
	 {
		 if (st[i]) continue;
		 if(cupleaza(i)) nr++;
		 else
		 {
			 memset(viz,0,sizeof(viz));
			 if (cupleaza(i)) nr++;
		 }
	 }
}

int main()
{int x,y,E,i;
	ifstream f("cuplaj.in");
	//****citire graf
	f>>N1>>N2>>E;//N1  cardinalul primei multimi N2 cardinalul a celei de a doua multime
	for(i=1;i<=E;i++)
	{
		f>>x>>y;
		G[x].push_back(y);
		G[y].push_back(x);
	}
	f.close();
	cuplaj();
	ofstream g("cuplaj.out");
	

g<<nr<<"\n";
	for(i=1;i<=nr;i++)
	
		 g<<st[i]<<" "<<dr[i]<<"\n";
	g.close();
	return 0;
}