HDU-2444 The Accomodation of Students
阿新 • • 發佈:2018-12-16
先看圖是否是二分圖,用染色來判斷即可,兩種顏色,相鄰的點染不同的顏色,沒有衝突即可
dfs染色分完之後,再用匈牙利演算法求最大匹配
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> using namespace std; typedef long long ll; const int N=200+10; const int M=80000+10; struct Edge { int to,nxt; }edge[M]; int tot,first[N]; void addedge(int u,int v) { edge[tot].to=v; edge[tot].nxt=first[u]; first[u]=tot++; } void init() { tot=0; memset(first,-1,sizeof(first)); } int linker[N]; bool used[N]; bool dfs(int u) { for(int i=first[u];i!=-1;i=edge[i].nxt) { int v=edge[i].to; if(!used[v]) { used[v]=true; if(linker[v]==-1||dfs(linker[v])) { linker[v]=u; return true; } } } return false; } int uN; int col[N]; int hungary() { int res=0; memset(linker,-1,sizeof(linker)); for(int i=1;i<=uN;i++) { if(col[i]==-1) continue; memset(used,false,sizeof(used)); if(dfs(i)) res++; } return res; } bool dfs0(int u,int c) { if(col[u]) { if(col[u]==c) return true; else return false; } col[u]=c; for(int i=first[u];i!=-1;i=edge[i].nxt) { int v=edge[i].to; if(!dfs0(v,-c)) return false; } return true; } bool solve() { memset(col,0,sizeof(col)); for(int i=1;i<=uN;i++) if(!col[i]&&!dfs0(i,1)) return false; return true; } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { init(); int a,b; for(int i=0;i<m;i++) { scanf("%d%d",&a,&b); addedge(a,b); addedge(b,a); } uN=n; if(!solve()) printf("No\n"); else printf("%d\n",hungary()); } return 0; }