Pagini recente » Cod sursa (job #1916665) | Cod sursa (job #792449) | Cod sursa (job #1451357) | Cod sursa (job #1464630) | Cod sursa (job #3302914)
#include <fstream>
#include <algorithm>
#include <random>
#include <vector>
#include <bitset>
using namespace std;
const int NMAX = 8193;
ifstream cin("felinare.in");
ofstream cout("felinare.out");
vector <vector <int>> v;
vector <int> ord;
bitset <NMAX> f1, f2;
int cuplaj_st[NMAX], cuplaj_dr[NMAX];
int pair_up(int start) {
if(f1[start])
return 0;
f1[start] = 1;
for(const int& vec : v[start]) {
if(!cuplaj_dr[vec]) {
cuplaj_st[start] = vec;
cuplaj_dr[vec] = start;
return 1;
}
}
for(const int& vec : v[start]) {
if(cuplaj_dr[vec] != start && pair_up(cuplaj_dr[vec])) {
cuplaj_st[start] = vec;
cuplaj_dr[vec] = start;
return 1;
}
}
return 0;
}
void dfs(int start) { ///suntem pe partea st
f1[start] = 0;
for(auto vec : v[start]) {
if(cuplaj_st[start] != vec && !f2[vec]) {
f2[vec] = 1;
if(f1[cuplaj_dr[vec]]) ///dc e nevoie (care ar TREBUI always), mergem pe muchia de cuplaj
dfs(cuplaj_dr[vec]);
}
}
}
int main() {
int n, m;
cin >> n >> m;
v.resize(n + 1);
for(int i = 1; i <= m; i++) {
int a, b;
cin >> a >> b;
v[a].push_back(b);
}
///P1) Cuplaj
mt19937 g(23214235);
for(int i = 1; i <= n; i++)
ord.push_back(i);
shuffle(ord.begin(), ord.end(), g);
while(1) {
f1 = 0;
int cnt = 0;
for(auto i : ord) {
if(!cuplaj_st[i])
cnt += pair_up(i);
}
if(!cnt)
break;
}
/*for(int i = 1; i <= n; i++) {
if(cuplaj_st[i])
cout << i << " " << cuplaj_st[i] << '\n';
}*/
///P2) MVC
///ce are f[i] = 1 --> ESTE in solutie
for(int i = 1; i <= n; i++) ///la inceput toate sunt, le scoatem DOAR dc trecem prin ele
f1[i] = 1;
f2 = 0;
for(int i = 1; i <= n; i++) {
if(!cuplaj_st[i]) ///facem dfs
dfs(i);
}
///P3) MIS
int ans = 0;
for(int i = 1; i <= n; i++) {
ans += (!f1[i]);
ans += (!f2[i]);
}
cout << ans << '\n';
for(int i = 1; i <= n; i++) {
int cnt = 0;
if(!f1[i])
cnt++;
if(!f2[i])
cnt += 2;
cout << cnt << '\n';
}
/*cout << "St: ";
for(int i = 1; i <= n; i++) {
if(f1[i])
cout << i << " ";
}
cout << '\n';
cout << "Dr: ";
for(int i = 1; i <= n; i++) {
if(f2[i])
cout << i << " ";
}
cout << '\n';*/
return 0;
}