算法笔记--二分图判定
算法笔记
挑战程序设计p98
#include<bits/stdc++.h> using namespace std; #define ll long long #define ls rt<<1,l,m #define rs rt<<1|1,m+1,r const int INF=0x3f3f3f3f; const int N=1e5+5; vector<int>g[N]; int color[N]={0}; bool dfs(int u, int c) { color[u]=c; for(int i=0;i<g[u].size();i++) { if(color[g[u][i]]==c)return false; if(color[g[u][i]]==0&&!dfs(g[u][i],-c))return false; } return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); int n; cin>>n; for(int i=0;i<n;i++) { int t; cin>>t; while(t--) { int a; cin>>a; g[i].push_back(a); } } for(int i=0;i<n;i++) { if(color[i]==0) { if(!dfs(0,1)) { cout<<"NO"<<endl; return 0; } } } cout<<"YES"<<endl; return 0; }
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; #define ll long long #define ls rt<<1,l,m #define rs rt<<1|1,m+1,r const int INF=0x3f3f3f3f; const int N=1e5+5; vector<int>g[N]; int color[N]={0}; bool dfs(int u, int c) { color[u]=c; for(int i=0;i<g[u].size();i++) { if(color[g[u][i]]==c)return false; if(color[g[u][i]]==0&&!dfs(g[u][i],-c))return false; } return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t,n,m,u,v; cin>>t; while(t--) { cin>>n>>m; for(int i=1;i<=n;i++)g[i].clear(); memset(color,0,sizeof(color)); for(int i=0;i<m;i++) { cin>>u>>v; g[u].push_back(v); g[v].push_back(u); } bool flag=true; for(int i=1;i<=n;i++) { if(color[i]==0) { if(!dfs(i,1)) { flag=false; } } } if(flag)cout<<"Correct"<<endl; else cout<<"Wrong"<<endl; } return 0; }
例题2:HDU 3478 Catch
代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back #define mem(a,b) memset(a,b,sizeof(a)) const int N=1e5+5; vector<int>g[N]; //bool vis[N]={false}; int color[N]={0} ; /*void dfs(int o,int u)//联通性判定 { vis[u]=true; for(int &v:g[u])if(v!=o&&!vis[v])dfs(u,v); }*/ bool DFS(int u,int c)//二分图判定 { color[u]=c; for(int &v:g[u]) { if(color[v]==c)return false; if(color[v]==0&&!DFS(v,-c))return false; } return true; } int main() { ios::sync_with_stdio(false); cin.tie(0); int t,n,m,s,u,v,cse=1; cin>>t; while(t--) { cin>>n>>m>>s; for(int i=0;i<n;i++)g[i].clear(); for(int i=0;i<m;i++)cin>>u>>v,g[u].pb(v),g[v].pb(u); cout<<"Case "<<cse++<<": "; //mem(vis,false); mem(color,0); //dfs(0,0); bool flag=true; //for(int i=0;i<n;i++)if(!vis[i])flag=false; if(DFS(0,1))flag=false; if(flag)cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步