二分图
二分图判定:二着色
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <vector> 5 using namespace std; 6 7 int T; 8 int N, M; 9 int c[10001]; 10 bool visit[10001]; 11 vector<vector<int> > m; 12 13 bool bfs(int idx, int flag) { 14 visit[idx] = true; 15 c[idx] = flag; 16 for (int i = 0; i < m[idx].size(); ++i) { 17 if (c[m[idx][i]] == c[idx]) return false; 18 else c[m[idx][i]] = -flag; 19 } 20 for (int i = 0; i < m[idx].size(); ++i) { 21 if (!visit[m[idx][i]] && !bfs(m[idx][i], -flag)) 22 return false; 23 } 24 return true; 25 } 26 27 void solve() { 28 memset(c, 0, sizeof(c)); 29 memset(visit, false, sizeof(visit)); 30 for (int i = 0; i < N; ++i) { 31 if (!visit[i] && !bfs(i, 1)) { 32 cout << "Wrong" << endl; 33 return; 34 } 35 } 36 cout << "Correct" << endl; 37 } 38 39 int main() { 40 cin >> T; 41 for (int t = 0; t < T; ++t) { 42 m.clear(); 43 cin >> N >> M; 44 m.resize(N + 1); 45 int u, v; 46 for (int i = 0; i < M; ++i) { 47 cin >> u >> v; 48 m[u].push_back(v); 49 m[v].push_back(u); 50 } 51 solve(); 52 } 53 return 0; 54 }
二分图最大匹配:Hungary算法
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int N, M; 5 vector<vector<int>> graph; 6 vector<int> link; 7 vector<bool> visited; 8 int a, b; 9 10 int dfs(int u) { 11 for (auto v : graph[u]) if (!visited[v]) { 12 visited[v] = true; 13 if (link[v] == -1 || dfs(link[v])) { 14 link[v] = u; 15 return 1; 16 } 17 } 18 return 0; 19 } 20 21 int hungary() { 22 int res = 0; 23 for (int i = 0; i <= N; ++i) { 24 visited.assign(N + 1, false); 25 res += dfs(i); 26 } 27 return res / 2; 28 } 29 30 int main() { 31 while (cin >> N >> M) { 32 graph.assign(N + 1, vector<int>()); 33 link.assign(N + 1, -1); 34 for (int i = 0; i < M; ++i) { 35 cin >> a >> b; 36 graph[a].push_back(b); 37 graph[b].push_back(a); 38 } 39 int res = hungary(); 40 cout << res << endl; 41 } 42 return 0; 43 }