Pagini recente » Cod sursa (job #15869) | Cod sursa (job #2079641) | Istoria paginii runda/judet9-1 | Cod sursa (job #2382885) | Cod sursa (job #2425861)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
vector<vector<int> > Graph(8192);
int N, M, i, j, Sol[8192][3], ToRight[8192], ToLeft[8192], Supp[8192], done, Mx;
bool Check[8192];
int Cuplaj(int i);
int main()
{
freopen("felinare.in", "r", stdin);
freopen("felinare.out", "w", stdout);
scanf("%d%d", &N, &M);
for(i=1; i<=N; ++i) Graph[i].push_back(0);
for(i=1; i<=M; ++i) {
int x, y;
scanf("%d%d", &x, &y);
++Graph[x][0]; Graph[x].push_back(y);
}
do{
done=0;
for(i=1; i<=N; ++i) Check[i]=false;
for(i=1; i<=N; ++i) if(ToRight[i]==0) if(Cuplaj(i)!=0) {done=1; ++Mx;}
}while(done!=0);
printf("%d\n", 2*N-Mx);
for(i=1; i<=N; ++i) printf("0\n");
return 0;
}
int Cuplaj(int i){
if(Check[i]==true) return 0;
Check[i]=true;
int j;
for(j=1; j<=Graph[i][0]; ++j) if(ToLeft[Graph[i][j]]==0){
ToRight[i]=Graph[i][j];
ToLeft[Graph[i][j]]=i;
return 1;
}
for(j=1; j<=Graph[i][0]; ++j) if(Cuplaj(Graph[i][j])!=0){
ToRight[i]=Graph[i][j];
ToLeft[Graph[i][j]]=i;
return 1;
}
return 0;
}