Pagini recente » Cod sursa (job #258538) | Cod sursa (job #1030737) | Cod sursa (job #844930) | Cod sursa (job #1973896) | Cod sursa (job #2709145)
#include<bits/stdc++.h>
using namespace std;
const int MAX_N = 20001;
ifstream fin( "felinare.in" );
ofstream fout( "felinare.out" );
vector<int> edges[MAX_N];
int p[MAX_N], ans[MAX_N];
bool viz[MAX_N];
int n, m, e;
bool dfs( int u ) {
viz[u] = 1;
for( int v : edges[u] )
if( !p[v] ) {
p[v] = u;
p[u] = v;
return 1;
}
for( int v : edges[u] ) {
if( viz[v] )
continue;
viz[v] = 1;
if( dfs( p[v] ) ) {
p[v] = u;
p[u] = v;
return 1;
}
}
return 0;
}
int main() {
fin>>n>>e;
for( int i = 0; i < e; i++ ) {
int a, b;
fin>>a>>b;
b += n;
edges[a].push_back( b );
edges[b].push_back( a );
}
int cnt = 0;
bool g = true;
while( g ) {
for( int i = 1; i <= n + n; i++ )
viz[i] = 0;
g = 0;
for( int i = 1; i <= n; i++ ) {
if( viz[i] || p[i] )
continue;
if( dfs( i ) ) {
g = 1;
cnt++;
}
}
}
memset(viz, 0, sizeof(viz));
fout<<2*n - cnt<<"\n";
for( int i = 1; i <= n + n; i++ ) {
if( !p[i] ) {
viz[i] = 1;
ans[i] += (i > n) ? 2:1;
}
}
for( int i = 1; i <= n + n; i ++ ) {
if( !viz[i] ) {
bool flag = true;
for( const auto &it : edges[i] ) {
if( viz[it] == 1 )
flag = false;
}
if( flag == true ) {
ans[i] += (i > n) ? 2:1;
viz[i] = true;
viz[p[i]] = true;
}
}
}
for( int i = 1; i <= n; i ++ )
fout<<ans[i] + ans[i + n]<<"\n";
return 0;
}