Cod sursa(job #841217)

Utilizator lily3Moldovan Liliana lily3 Data 23 decembrie 2012 22:02:23
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<fstream>
#include<vector>
#include<cstring>
using namespace std;
ofstream g("strazi.out");

int i,j,n,m,viz[256],tata[265],fiu[256],x,y,nr,ok;
vector<int> a[256];
int cupleaza(int nod)
{
	int i;
	if(viz[nod])
		return 0;
	viz[nod]=1;
	for(i=0;i<a[nod].size();++i)
		if(!tata[a[nod][i]]||cupleaza(tata[a[nod][i]]))
		{
			fiu[nod]=a[nod][i];
			tata[a[nod][i]]=nod;
			return 1;
		}
		return 0;
}
int df(int nod)
{
   if(!fiu[nod])
   return nod;
   return df(fiu[nod]);
}
void afis(int nod)
{
    if(!nod )
    return ;
    g<<nod<<" ";
    afis(fiu[nod]);
}
int main()
{
	ifstream f("strazi.in");

	f>>n>>m;
	for(i=1;i<=m;++i)
	{
		f>>x>>y;
		a[x].push_back(y);
	}
	for(i=1;i<=n;++i)
	{
	    memset(viz,0,sizeof(viz));
			cupleaza(i);
	}
    for(i=1;i<=n;++i)
    if(!tata[i])
    ++nr;
    g<<nr-1<<"\n";
    for(i=1;i<=n;++i)
    if(!tata[i])
    {
    x=df(i);
    ok=0;
    for(j=1;j<=n&&!ok;++j)
    if(!tata[j]&&i!=j)
    {
        ok=1;
        g<<x<<" "<<j<<"\n";
        tata[j]=x;
        fiu[x]=j;
    }
    }
    for(i=1;i<=n;++i)
    if(!tata[i])
        afis(i);
	return 0;
}