hdu 2444判定二分图+最大匹配
2015-09-08 21:27
281 查看
两连发板子题,水果留恋
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; const int INF=0x3f3f3f3f; const int maxn=208; struct shit{ int v,next; }edge[maxn*maxn<<1]; int tol; int head[maxn]; void init() { tol=0; memset(head,-1,sizeof(head)); } void addedge(int u,int v) { edge[tol].v=v; edge[tol].next=head[u]; head[u]=tol++; } int color[maxn]; bool judfs(int u,int co) { int i,v; color[u]=co; for(i=head[u];i!=-1;i=edge[i].next) { v=edge[i].v; if(color[v]==co) return false; if(color[v]==-1&&!judfs(v,co^1)) return false; } return true; } bool vis[maxn]; int pre[maxn]; bool find(int u) { int i,v; for(i=head[u];i!=-1;i=edge[i].next) { v=edge[i].v; if(vis[v]) continue; vis[v]=true; if(pre[v]==-1||find(pre[v])) { pre[v]=u; return true; } } return false; } int hungary(int n) { int i,ans; memset(pre,-1,sizeof(pre)); ans=0; for(i=1;i<=n;i++) { memset(vis,false,sizeof(vis)); if(find(i)) ans++; } return ans; } int main() { int i,j,n,m,u,v; while(scanf("%d%d",&n,&m)==2) { init(); for(i=1;i<=m;i++) { scanf("%d%d",&u,&v); addedge(u,v); addedge(v,u); } memset(color,-1,sizeof(color)); bool flag; for(u=1;u<=n;u++) { if(color[u]==-1) { flag=judfs(u,0); if(!flag) break; } } if(u<=n) printf("No\n"); else printf("%d\n",hungary(n)>>1); } return 0; }
相关文章推荐
- poj1308 并查集
- Linux网络属性配置管理及其相关命令
- Objective-C之深拷贝与浅拷贝
- 不看别人
- 代理模式
- lintcode-带重复元素的排列 -16
- hdu 4405 Aeroplane chess(概率dp)
- mysql group by 用法解析(详细)
- 完整版单例代码
- poj 3390 Print Words in Lines 动态规划
- Linux精品之NFS介绍与应用(双httpd + php-fpm + nfs + mysql 搭建discuz论坛)
- unity3D-----------socket客户端、服务器(简单)
- Spring定时任务的几种实现
- 第51讲:Scala中链式调用风格的实现代码实战及其在Spark编程中的广泛运用
- django 1.8 官方文档翻译: 2-5-7 自定义查找
- 简单Latex
- UI中的隐藏键盘的三个小方法
- [转] MemCached 的 stats 命令
- PIC16F887 SPI CAN 传输,操作MCP2515
- 第18章(二)TCP状态变迁图与2MSL等待状态