Cod sursa(job #396546)

Utilizator FlorianFlorian Marcu Florian Data 15 februarie 2010 15:47:50
Problema Strazi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
using namespace std;
#include<vector>
#include<fstream>
const int MAX_N = 280;
#define pb push_back
vector<int>G[MAX_N], D[MAX_N];
int N, M, SOL;
int st[MAX_N], dr[MAX_N];
bool viz[MAX_N];
bool pairUp(int x)
{
	if(viz[x]) return 0;
	viz[x] = 1;
	unsigned i; int y;
	for(i = 0; i < G[x].size(); ++i)
	{
		y = G[x][i];
		if( !st[y] )
		{
			st[y] = x;
			dr[x] = y;
			return 1;
		}
	}
	for(i = 0; i < G[x].size(); ++i)
	{
		y = G[x][i];
		if( pairUp( st[y] ))
		{
			st[y] = x;
			dr[x] = y;
			return 1;
		}
	}
	return 0;
}
int main()
{
	ifstream in("strazi.in"); 	ofstream out("strazi.out");
	in>>N>>M;
	int i, j, ok,x,y;
	for(;M;--M)
	{
		in>>x>>y;
		G[x].pb(y);
	}
	for(ok = 1; ok;)
	{
		ok = 0;
		memset(viz,0, sizeof(viz));
		for(i = 1; i <= N; ++i)
			if(!dr[i]) 
				ok |= pairUp(i);
	}
	for(i = 1; i <= N; ++i)
	{
		if(dr[i]) continue;
		++SOL;
		for(j = i; j; j = st[j])
			D[SOL].pb(j);
	}
	out<<SOL-1<<"\n";
	for(i = 1; i < SOL; ++i)
		out<<D[i].front()<<" "<<D[i+1].back()<<"\n";
	for(i = 1; i <= SOL; ++i)
		for(j = D[i].size()-1; j >= 0; --j)
			out<<D[i][j]<<" ";
	return 0;
}