Nu aveti permisiuni pentru a descarca fisierul grader_test6.in
Cod sursa(job #1549406)
| Utilizator | Data | 12 decembrie 2015 12:11:36 | |
|---|---|---|---|
| Problema | Cuplaj maxim in graf bipartit | Scor | 0 |
| Compilator | cpp | Status | done |
| Runda | Arhiva educationala | Marime | 1.17 kb |
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int MAX = 10005;
vector <int> g[MAX];
int st[MAX], dr[MAX],vis[MAX],c[2*MAX];
int dfs(int k){
vis[k] = 1;
for (int i = 0; i<g[k].size(); ++i){
if (vis[g[k][i]] || c[k] == g[k][i])
continue;
if (c[g[k][i]] == -1) {
c[k] = g[k][i];
c[g[k][i]] = k;
vis[g[k][i]] = 1;
return 1;
}
else {
vis[g[k][i]] = 1;
if (dfs(c[g[k][i]])) {
c[k] = g[k][i];
c[g[k][i]] = k;
return 1;
}
else continue;
}
}
return 0;
}
int main() {
freopen("cuplaj.in", "r", stdin);
freopen("cuplaj.out", "w", stdout);
memset(c, -1, sizeof(c));
int n, m, e, nr = 0;
cin >> n >> m >> e;
for (int i = 1; i <= e; i++) {
int a, b;
cin >> a >> b;
g[a].push_back(b);
g[b].push_back(a);
}
int ok = 1;
while (ok) {
ok = false;
memset(vis, 0, sizeof(vis));
for (int i = 1; i <= n; i++)
if (c[i] == -1 && dfs(i))
ok = true;
}
for (int i = 1; i <= n; i++)
if (c[i] != -1)
nr++;
cout << nr << "\n";
for (int i = 1; i <= n; i++)
if (c[i] != -1)
cout << i << " " << c[i] << "\n";
return 0;
}
