Nu aveti permisiuni pentru a descarca fisierul grader_test1.ok
Cod sursa(job #1462956)
Utilizator | Data | 19 iulie 2015 15:06:44 | |
---|---|---|---|
Problema | Felinare | Scor | 40 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.6 kb |
#include <cstdio>
#include <cstring>
FILE* in=fopen("felinare.in","r");
FILE* out=fopen("felinare.out","w");
const int Q=20007;
int lst[Q],val[Q],nxt[Q],nr;
int flst[Q],fval[Q],fnxt[Q];
void add(int a, int b)
{
val[++nr]=b;
nxt[nr]=lst[a];
lst[a]=nr;
fval[nr]=a;
fnxt[nr]=flst[b];
flst[b]=nr;
}
int to[Q],frm[Q];
bool viz[Q];
bool cuplaj(int x)
{
viz[x]=1;
for(int p=lst[x]; p; p=nxt[p])
{
if(frm[val[p]]==0)
{
to[x]=val[p];
frm[val[p]]=x;
return 1;
}
}
for(int p=lst[x]; p; p=nxt[p])
{
if(viz[frm[val[p] ] ]==0 && cuplaj(frm[val[p]]))
{
to[x]=val[p];
frm[val[p]]=x;
return 1;
}
}
return 0;
}
int rez[Q];
bool v1[Q],v2[Q];
void dfs2(int x, int vl);
void dfs1(int x, int vl)
{
if(v1[x])
return;
v1[x]=1;
rez[x]+=vl;
for(int p=lst[x]; p; p=nxt[p])
{
if(to[x]!=val[p])
{
dfs2(val[p],vl);
}
}
}
void dfs2(int x, int vl)
{
if(v2[x])
return;
v2[x]=1;
rez[x]+=vl;
for(int p=flst[x]; p; p=fnxt[p])
{
if(frm[x]!=fval[p])
{
dfs1(fval[p],vl);
}
}
}
int n,m;
void finise()
{
for(int i=1; i<=n; i++)
{
if(to[i]==0)
{
dfs1(i,1);
}
if(frm[i]!=0)
{
dfs2(i,2);
}
}
for(int i=1; i<=n; i++)
{
fprintf(out,"%d\n",rez[i]);
}
}
int main()
{
fscanf(in,"%d%d",&n,&m);
int a,b;
for(int i=1; i<=m; i++)
{
fscanf(in,"%d%d",&a,&b);
add(a,b);
}
int r=2*n;
while(true)
{
bool bun=0;
for(int i=1; i<=n; i++)
{
if(viz[i]==0 && to[i]==0 && cuplaj(i))
{
bun=1;
r--;
}
}
if(bun==0)
break;
memset(viz,0,sizeof viz);
}
fprintf(out,"%d\n",r);
finise();
return 0;
}