Pagini recente » Cod sursa (job #1980075) | Cod sursa (job #197633) | Cod sursa (job #132140) | Cod sursa (job #1207220) | Cod sursa (job #994166)
Cod sursa(job #994166)
//#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,bool 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 (viz[i]==false&&viz[cuplaj[i]]==false)
if (stare[i]==false&&cuplaj[i]&&stare[cuplaj[i]]==false) {
int N=H[i].size();
bool okz=false;
for(int j=0;j<N;++j)
if (stare[H[i][j]]==true)
okz=true;
if (okz==false) result[i]++;
else result[cuplaj[i]-n]+=2;
}
for(i=1; i<=n; ++i) cout<<result[i]<<'\n';
f.close();
g.close();
return 0;
}