hdu 2444 The Accomodation of Students (判断二分图+最大匹配)
2015-07-24 11:20
513 查看
//hdu 2444(判断二分图+最大匹配) //判断二分图用bfs进行染色,如果染色过程中出现矛盾,就不是二分图。0-1-0-1-0 //二分图的充要条件,无向图中,顶点数大于2,且所有回路长度都是偶数。 #include<cstdio> #include<cstring> #include<iostream> using namespace std; const int N=400; int n,m,k; int g ; struct Hungary{ int line ,vis ; void init(){ memset(line,-1,sizeof(line)); } bool dfs(int u,int n){ for(int i=0;i<n;i++){ if(!vis[i]&&g[u][i]){ vis[i]=1; if(line[i]==-1||dfs(line[i],n)){ line[i]=u; return 1; } } } return 0; } int Max_match(int n){ int all=0; for(int i=0;i<n;i++){ memset(vis,0,sizeof(vis)); if(dfs(i,n))all+=1; } return all; } }; Hungary huy; bool BFS(int n){ int dep ,q ; memset(dep, -1, sizeof(dep)); int front,rear; for(int j=0;j<n;j++){ front=rear=0; if(dep[j]==-1){ q[rear++]=0;dep[0]=0; while(front<rear){ int k=q[front++]; int nex=(dep[k]+1)%2; for(int i=0;i<n;i++){ if(i!=k&&g[k][i]){ if(dep[i]==-1){ dep[i]=nex; q[rear++]=i; } else { if(dep[i]!=nex)return 0; } } } } } } return 1; } int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ int u,v; memset(g,0,sizeof(g)); for(int i=0;i<m;i++){ scanf("%d%d",&u,&v); u--;v--; g[u][v]=g[v][u]=1; } if(!BFS(n)){ printf("No\n"); continue; } huy.init(); printf("%d\n",huy.Max_match(n)/2); } return 0; }
相关文章推荐
- Ubuntu14.04 root登录 ssh 连接
- 【用户界面:android-Ultra-Pull-To-Refresh】之一:android-Ultra-Pull-To-Refresh开篇
- 登陆整合实现-QQ互联认证(ASP.NET版本)
- chorme 插件
- Search a 2D Matrix II
- javaScript中的数据类型
- WCF:如何将net.tcp协议寄宿到IIS
- Leetcode Q3:Longest Substring Without Repeating Characters
- 最小生成树之prim算法
- NYOJ 1073 最小值
- mysql mysql SELECT 自增数显示
- HDU 2874 Connections between cities(LCA Tarjan)
- web浏览器中javascript
- 轻量级javascript 框架Backbone使用指南
- Mongodb千万级数据在python下的综合压力测试及应用探讨
- 结构型模式-外观模式
- Http长连接200万尝试及调优
- PHP,My Sql 备忘
- 八大排序算法:冒泡排序
- jQuery阻止事件冒泡