小记:这题主要是判断给定的图是否是二分图匹配,如果是的,求出最大匹配。这题数据比较水。
思路:求图是否可以二分,可以使用dfs染色,或者bfs染色,或者并查集,
这里我使用的是dfs染色,比较简单的一种。
代码:
#include <iostream> #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <map> #include <set> #include <vector> #include <stack> #include <queue> #include <algorithm> #include <string> using namespace std; #define mst(a,b) memset(a,b,sizeof(a)) #define REP(a,b,c) for(int a = b; a < c; ++a) #define REPL(a, b) for(int a = head[b]; a+1; a = edge[a].next) #define eps 10e-8 #define DEBUG printf("here"); const int MAX_ = 200; const int N = 100010; const int INF = 0x7fffffff; int g[MAX_][MAX_]; bool vis[MAX_]; int link[MAX_]; int n, M; int dfs(int s) { REP(i, 1, n+1){ if(g[s][i] && !vis[i]){ vis[i] = 1; if(link[i] == -1 || dfs(link[i])){ link[i] = s; return 1; } //vis[i] = 0; } } return 0; } int bfs() { mst(link, -1); int ans = 0; REP(i, 1, n+1){ mst(vis, 0); if(dfs(i))++ans; } return ans; } int dfsdye(int x) { REP(i, 1, n+1){ if(g[x][i]){ if(!link[i]){ link[i] = !link[x]; int tmp = dfsdye(i); if(tmp == 0)return 0; } else if(link[i] == link[x]) return 0; } } return 1; } int main(){ int T, m, s, t, cnt; while(~scanf("%d%d", &n, &m)){ if(n == 1){ printf("No\n");continue; } mst(g, 0); mst(link, 0); REP(j, 0, m){ scanf("%d%d", &s, &t); g[s][t] = g[t][s] = 1; } link[1] = 1; int ans = dfsdye(1); if(!ans){printf("No\n");continue;} printf("%d\n", bfs()/2); } return 0; }