Cod sursa(job #284271)

Utilizator ScrazyRobert Szasz Scrazy Data 21 martie 2009 14:45:56
Problema Felinare Scor 2
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;

const int maxn = 2*8192;
int n, m;

struct edge
{
    int cap, flux;
    int e, v;
    edge(){}
    edge(int a, int b, int c, int d)
    {
	e = a; b = v; cap = c; flux = d;
    }
};

struct nod
{
    int dest;
    int nr;
    nod(){}
    nod(int a, int b)
    {
	dest = a; nr = b;
    }
};

/*
vector<int> adj[maxn];

vector<edge> e[maxn];
vector<edge> rev[maxn];

int nrev[maxn];
int p[maxn];
*/

vector<edge> e;
vector<nod> g[maxn];

nod p[maxn];
int viz[maxn];

void read()
{
    scanf("%d%d", &n, &m);
    
    int i = m;
    m = -1;
    for (; i; --i)
    {
	int x, y; scanf("%d%d", &x, &y);
	y += n;

	e.push_back(edge(x, y, 1, 0)); 
	g[x].push_back(nod(y, ++m)); 
	e.push_back(edge(y, x, 0, 0));
	g[y].push_back(nod(x, ++m));
    }

    for (int i = 1; i <= n; ++i)
    {
	e.push_back(edge(0, i, 1, 0));
	g[0].push_back(nod(i, ++m)); 
	e.push_back(edge(i, 0, 0, 0));
	g[i].push_back(nod(0, ++m));
    }

    for (int i = n + 1; i <= 2 * n; ++i)
    {
	e.push_back(edge(i, 2 * n + 1, 1, 0));
	g[i].push_back(nod(2 * n + 1, ++m));
	e.push_back(edge(2 * n + 1, i, 0, 0));
	g[2 * n + 1].push_back(nod(i, ++m)); 
    }
}


int bfs()
{ 
    queue<int> Q;
    memset(viz, 0, sizeof(viz));
    Q.push(0); viz[0] = 1;

    while(!Q.empty())
    {
	int now = Q.front();
	Q.pop();

	for (int i = 0; i < g[now].size(); ++i)
	{ 
	    int next = g[now][i].dest; int en = g[now][i].nr;
	    if (viz[next]) continue;
	    if (e[en].flux == e[en].cap) continue;

	    p[next].dest = now;
	    p[next].nr = en;
	    if (next == 2 * n + 1) return 1;

	    Q.push(next);
	}
    }

    return 0;
}

int maxflow = 0;

void flux()
{

    while (bfs())
    {
	for (int i = 2 * n + 1; i != 0; i = p[i].dest) 
	{ 
	    //hmm 
	    int en = p[i].nr; 
	    e[en].flux++; 

	    en++;
	    e[en].flux--;
	}

	++maxflow;
    }
}

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

    read();

    flux();

    printf("%d\n", 2 * n - maxflow);
    
    return 0;
}