Nu aveti permisiuni pentru a descarca fisierul grader_test1.ok

Cod sursa(job #1462956)

Utilizator cnitv1CNITV Paul Radu Mihai cnitv1 Data 19 iulie 2015 15:06:44
Problema Felinare Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <cstdio>
#include <cstring>

FILE* in=fopen("felinare.in","r");
FILE* out=fopen("felinare.out","w");

const int Q=20007;

int lst[Q],val[Q],nxt[Q],nr;
int flst[Q],fval[Q],fnxt[Q];

void add(int a, int b)
{
	val[++nr]=b;
	nxt[nr]=lst[a];
	lst[a]=nr;

	fval[nr]=a;
	fnxt[nr]=flst[b];
	flst[b]=nr;
}

int to[Q],frm[Q];
bool viz[Q];

bool cuplaj(int x)
{
	viz[x]=1;

	for(int p=lst[x]; p; p=nxt[p])
	{
		if(frm[val[p]]==0)
		{
			to[x]=val[p];
			frm[val[p]]=x;
			return 1;
		}
	}

	for(int p=lst[x]; p; p=nxt[p])
	{
		if(viz[frm[val[p] ] ]==0 && cuplaj(frm[val[p]]))
		{
			to[x]=val[p];
			frm[val[p]]=x;
			return 1;
		}
	}

	return 0;
}

int rez[Q];

bool v1[Q],v2[Q];


void dfs2(int x, int vl);

void dfs1(int x, int vl)
{
	if(v1[x])
		return;
	v1[x]=1;

	rez[x]+=vl;

	for(int p=lst[x]; p; p=nxt[p])
	{
		if(to[x]!=val[p])
		{
			dfs2(val[p],vl);
		}
	}
}

void dfs2(int x, int vl)
{
	if(v2[x])
		return;
	v2[x]=1;

	rez[x]+=vl;

	for(int p=flst[x]; p; p=fnxt[p])
	{
		if(frm[x]!=fval[p])
		{
			dfs1(fval[p],vl);
		}
	}
}

int n,m;

void finise()
{
	for(int i=1; i<=n; i++)
	{
		if(to[i]==0)
		{
			dfs1(i,1);
		}
		if(frm[i]!=0)
		{
			dfs2(i,2);
		}
	}

	for(int i=1; i<=n; i++)
	{
		fprintf(out,"%d\n",rez[i]);
	}
}


int main()
{
    fscanf(in,"%d%d",&n,&m);

    int a,b;

    for(int i=1; i<=m; i++)
    {
		fscanf(in,"%d%d",&a,&b);

		add(a,b);
    }

	int r=2*n;

    while(true)
    {
		bool bun=0;

		for(int i=1; i<=n; i++)
		{
			if(viz[i]==0 && to[i]==0 && cuplaj(i))
			{
				bun=1;
				r--;
			}
		}
		if(bun==0)
			break;
		memset(viz,0,sizeof viz);
    }

	fprintf(out,"%d\n",r);

    finise();

    return 0;
}