Pagini recente » Cod sursa (job #1924157) | Cod sursa (job #1994501) | Cod sursa (job #1801467) | Cod sursa (job #948285) | Cod sursa (job #994147)
Cod sursa(job #994147)
//#include <iostream>
#include <fstream>
using namespace std;
ifstream f("felinare.in");
ofstream g("felinare.out");
#define LE 60666
#include <vector>
#define pb push_back
#define cin f
#define cout g
bool viz[LE],still,stare[LE];
int result[LE],cuplaj[LE],n,m,i,j;
vector<int> H[LE];
bool pair_up(int nod) {
int N=H[nod].size(),i;
viz[nod]=true;
for(i=0; i<N; ++i)
if (viz[H[nod][i]]==false) {
viz[H[nod][i]]=true;
if (!cuplaj[H[nod][i]]) {
cuplaj[H[nod][i]]=nod;
cuplaj[nod]=H[nod][i];
return true;
} else if (viz[cuplaj[H[nod][i]]]==false) {
if (pair_up(cuplaj[H[nod][i]])) {
cuplaj[H[nod][i]]=nod;
cuplaj[nod]=H[nod][i];
return true;
}
}
}
return false;
}
void dfs(int nod,int state) {
stare[nod]=state;
int i,N=H[nod].size();
viz[nod]=true;
for(i=0; i<N; ++i)
if (viz[H[nod][i]]==false)
dfs(H[nod][i],!state);
}
int main() {
f>>n>>m;
for(i=1; i<=m; ++i) {
int xx,yy;
f>>xx>>yy;
H[xx].pb(yy+n);
H[yy+n].pb(xx);
}
int nr_result=0;
still=true;
while (still) {
still=false;
for(i=1; i<=n+n; ++i) viz[i]=false;
for(i=1; i<=n; ++i)
if (viz[i]==false&&cuplaj[i]==0){
bool res=pair_up(i);
still|=res;
if (res) ++nr_result;
}
}
cout<<2*n-nr_result<<'\n';
for(i=1; i<=n+n; ++i) viz[i]=false;
for(i=1; i<=n+n; ++i)
if (cuplaj[i]==0) stare[i]=true;
for(i=1; i<=n+n; ++i)
if (stare[i]==true&&viz[i]==false)
dfs(i,true);
for(i=1; i<=n; ++i)
if (stare[i]==true) result[i]++;
for(i=n+1; i<=n+n; ++i)
if (stare[i]==true) result[i-n]+=2;
for(i=1;i<=n;++i)
if (stare[i]==false&&cuplaj[i]&&stare[cuplaj[i]]==false){
stare[i]=true;
++result[i];
}
for(i=1; i<=n; ++i) cout<<result[i]<<'\n';
f.close();
g.close();
return 0;
}