二分图
如果两个结点由于某些性质不能归属到一个集合,那么在这两个点之间连一条边。在遍历所有点对,建图之后。如果通过染色法成功对图进行染色,那么这个图就是一个二分图,否则这个图不是二分图。下面是染色法判断二分图的模板。
const int N = 1010, M = N * N;int color[N];int h[N], e[M], ne[M], idx;bool dfs(int u, int c) {color[u] = c;for(int i = h[u]; ~i; i = ne[i]) {int j = e[i];if(color[j] == c) {return false;}if(color[j] == -1 && !dfs(j, 1 - c)) {return false;}}return true;}bool ok = true;memset(color, -1, sizeof color);for(int i = 0; i < n; i++) {if(color[i] == -1 && !dfs(i, 0)) {ok = false;break;}}
