#include <iostream> #include <cstdio> #include <string.h> #include <vector> #define inf 0xfffffff using namespace std; const int maxn = 1e5 + 1e2; const int maxp = 1e3 + 1e2; //邻接表vector实现 vector<int> G[maxp]; int color[maxp]; int n,m; void init() { memset(color,0,sizeof(color)); for(int i = 0;i <= n;i++) { G[i].clear(); } } bool dfs(int s,int clr) { color[s] = clr; for(int i = 0;i < G[s].size();i++) { int to = G[s][i]; if(color[to] == clr)return false; if(color[to] == 0 && !(dfs(to,-clr)))return false; } return true; } void solve() { for(int i = 0;i < n;i++) { if(color[i] == 0) { if(!dfs(i,1)) { printf("No "); return; } } } printf("Yes "); return; } int main() { while(cin >> n >> m) { init(); for(int i = 0;i < m;i++) { int a,b; cin>>a>>b; G[a].push_back(b); G[b].push_back(a); } solve(); } return 0; }
算法的大体思想是,对当前图进行二色染色只有两种颜色1 -1,从一个未染色的点开始,dfs进行染色,先染色当前点,然后对后续所有的点进行如下判断,如果下一个点已经染色且和当前颜色一样——》不是二分图,不一样——》不用管它忽略
如果下一个点没有染色呢,就尝试染色,如果染色失败,则回溯回来后任然是失败
染色成功,不管他,继续染色
以上是一个循环,直到solve函数找不到可以染色的点结束