Cod sursa(job #403061)

Utilizator ConsstantinTabacu Raul Consstantin Data 24 februarie 2010 15:51:24
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.2 kb
#include<stdio.h>
#include<vector>
#include<string.h>
using namespace std;
vector<int> v[ 260 ];
int s[ 260 ],d[ 260 ],n,m,i,j,k,I,sol[260],c,a,b,poz;

bool viz[ 260 ],ok;
bool cuplaj(int nod){
if(viz[nod])return false;
viz[nod] = true;
int N,i;
N = v[nod].size();
for(i = 0; i < N ; i++)
	if(!d[v[nod][i]])
		{s[nod] = v[nod][i];
		d[v[nod][i]] = nod;
		return true;
		}

for(i = 0;i < N ; i++)
	if(cuplaj(d[v[nod][i]]))
		{s[nod] = v[nod][i];
		d[v[nod][i]] = nod;
		return true;
		}
return false;
}

int main(){
freopen("strazi.in","r",stdin);
freopen("strazi.out","w",stdout);

scanf("%d %d",&n,&m);

for(i = 1 ; i <= m ; i++)
	{scanf("%d %d",&a,&b);
	v[a].push_back(b);
	}
	
ok = 1;
while(ok){
ok = 0;
memset(viz,0,sizeof(viz));
for(i = 1 ; i <= n ; i++)
	{if(!s[i] && cuplaj(i))
		{ok = 1;
		c++;
		}
		
	}
}

printf("%d \n",n-c-1);
for(i = 1 ; i <= n ; i++)
	if(!d[i]){poz = i;d[i] = -1;I = i;break;}

for(;poz;poz = s[poz])
	if(!s[poz])
		{if(c == n-1)break;
		else
		for(; i <= n;i++)
			if(!d[i])
				{s[poz] = i;
				printf("%d %d\n",poz,i);
				d[i] = poz;	c++;
				break;
			
				}
		}
		
for(;I;I = s[I])
	printf("%d ",I);

return 0;}