Pagini recente » Soluţii ONIS 2015, Runda 2 | Arhiva de probleme | Profil MihaelaCismaru | Istoria paginii utilizator/castiel15 | Cod sursa (job #222564)
Cod sursa(job #222564)
#include <cstdio>
#include <string>
#define N 8200
struct nod { int x; nod *n;};
nod *a[N];
int n, m;
bool use[N];
int l[N], r[N], sl[N], sr[N];
inline void add(int x, int y)
{
nod *p=new nod ;
p->x=y;
p->n=a[x];
a[x]=p;
}
void read()
{
freopen("felinare.in","r",stdin);
scanf("%d %d\n", &n,&m);
int p,q;
while(m--)
{
scanf("%d %d\n", &p, &q);
add(p,q);
}
}
inline bool pairup(int n)
{
if(use[n]) return 0;
use[n]=1;
for(nod *i=a[n]; i; i=i->n)
if(!l[i->x])
{
l[i->x]=n;
r[n]=i->x;
return 1;
}
for(nod *i=a[n]; i; i=i->n)
if(pairup(i->x))
{
l[i->x]=n;
r[n]=i->x;
return 1;
}
return 0;
}
void hopcroft_karp()
{
int ok=1,i,flow=0;
while(ok)
{
ok=0;
memset(use, 0, sizeof(use));
for(i=1;i<=n;++i)
if(!r[i])
if(pairup(i)) ++flow,ok=1;
}
flow=0;
for(i=1;i<=n;++i)
if(r[i]) ++flow;
freopen("felinare.out","w",stdout);
printf("%d\n", 2*n-flow);
return ;
for(i=1;i<=n;++i)
if(l[i] == 0) sl[i]=1;
for(i=1;i<=n;++i)
if(r[i] == 1) sr[i]=1;
for(i=1;i<=n;++i)
printf("%d\n", 1-(sl[i])+2*(1-sr[i]));
}
int main()
{
read();
hopcroft_karp();
return 0;
}