#include <cstdio> #include <cstring> const int MAXNODE = 510; const int MAXEDGE = 100010; struct Edge{ int v, next; Edge() {} Edge(int v, int next): v(v), next(next) {} }E[MAXEDGE]; int head[MAXNODE], color[MAXNODE]; int tot, n, m; void AddEdge(int u, int v) { E[tot] = Edge(v, head[u]); head[u] = tot++; } void init() { memset(head, -1, sizeof(head)); tot = 0; int u, v; for (int i = 0; i < m; i++) { scanf("%d%d", &u, &v); AddEdge(u, v); AddEdge(v, u); } } bool bipartite(int u) { for (int i = head[u]; ~i; i = E[i].next) { int v = E[i].v; //如果下一个节点的颜色和该节点的颜色相同,则冲突 if (color[v] == color[u]) return false; //如果下一个节点还没有染色,将其染色,染的颜色只有两种,要么为1,要么为2 if (!color[v]) { color[v] = 3 - color[u]; if (!bipartite(v)) return false; } } return true; } void solve() { //所有颜色未定,将1这个节点定义成颜色1,然后dfs进行染色 memset(color, 0, sizeof(color)); color[1] = 1; if (bipartite(1)) printf("YES\n"); else printf("NO\n"); } int main() { init(); solve(); return 0; }
浙公网安备 33010602011771号