Mai intai trebuie sa te autentifici.
Cod sursa(job #3201013)
| Utilizator | Data | 6 februarie 2024 15:31:18 | |
|---|---|---|---|
| Problema | Cuplaj maxim in graf bipartit | Scor | 100 |
| Compilator | cpp-64 | Status | done |
| Runda | Arhiva educationala | Marime | 1.22 kb |
#include <bits/stdc++.h>
#define DIM 200001
#define log yhgfrty
#define MOD 1000000007
using namespace std;
ifstream fin("cuplaj.in");
ofstream fout("cuplaj.out");
vector <int> G[DIM];
bool found[DIM];
int v[DIM], x[DIM];
int n, m, Q, a, b, answer, i;
bool can_pair;
bool join(int node){
found[node] = 1;
for(auto k : G[node])
if(!x[k]){
x[k] = node;
v[node] = k;
return true;
}
for(auto k : G[node])
if(!found[x[k]] && join(x[k])){
x[k] = node;
v[node] = k;
return true;
}
return false;
}
int main(){
fin >> n >> m >> Q;
for(i=1;i<=Q;i++){
fin >> a >> b;
G[a].push_back(b);
}
can_pair = true;
while(can_pair){
can_pair = false;
std :: fill(found + 1, found + n + 1, 0);
for(i=1;i<=n;i++)
if(!v[i])
can_pair |= join(i);
}
for(i=1;i<=n;i++)
if(v[i])
answer ++;
fout << answer << "\n";
for(i=1;i<=n;i++)
if(v[i])
fout << i << " " << v[i] << "\n";
}
