HDU 1281 棋盘游戏(匈牙利算法 二分最大匹配)
2014-07-28 22:47
274 查看
题意好理解,就最多能放几个车,而重要点的求解,,先求出最大匹配数m,每次去掉一个边(也就是一个关系)然后求最大匹配数k,如果k<m,说明该点是个重要点,因为少了此点最大匹配数不够原来的值了
题目链接:点击打开链接
代码注释:
题目链接:点击打开链接
代码注释:
<strong><span style="font-size:18px;color:#ff6600;">#include<iostream> #include<cstring> #include<cstdio> using namespace std; #define N 105 int a ,visit ,link ; int n,m; int dfs(int i) { for(int j=1; j<=m; j++) { if(a[i][j]&&!visit[j]) { visit[j]=1; if(link[j]==-1||dfs(link[j])) { link[j]=i; return 1; } } } return 0; } int hungary() { int sum=0; memset(link,-1,sizeof(link)); for(int i=1; i<=n; i++) { memset(visit,0,sizeof(visit)); if(dfs(i)) sum++; } return sum; } int main() { int i,k,t=1; int x[N*N],y[N*N]; while(cin>>n>>m>>k) { memset(a,0,sizeof(a)); for(i=0; i<k; i++) { scanf("%d%d",&x[i],&y[i]); a[x[i]][y[i]]=1; } int sum=hungary(); //前面就是模版hungary求最大匹配数,不懂得看我之前的博客 int ans=0; for(i=0; i<k; i++)//这里就是判断是不是重要点 { a[x[i]][y[i]]=0; int tem=hungary(); if(tem<sum) ans++; a[x[i]][y[i]]=1; } printf("Board %d have %d important blanks for %d chessmen.\n",t++,ans,hungary()); } }</span></strong>
相关文章推荐
- HDU 1281 棋盘游戏 二分匹配 匈牙利算法
- 棋盘游戏 HDU - 1281(二分匹配,匈牙利算法)
- hdu 1281 棋盘游戏(匈牙利(最大匹配+枚举))
- [HDOJ1281]棋盘游戏(二分图最大匹配,匈牙利算法)
- HDU 1281 棋盘游戏(最大二分匹配)
- hdu 1281 棋盘游戏(最大匹配·匈牙利)
- hdu 1281 棋盘游戏 (最大匹配,重要点)
- hdu 1281棋盘游戏 匈牙利算法
- HDU 1281 棋盘游戏 二分图最大匹配 + 枚举
- 【最大二分匹配匈牙利算法】hdu 3729
- HDU 1281 棋盘游戏 二分图的最大匹配
- hdu 1281 棋盘游戏(二分匹配)
- HDOJ---1281 棋盘游戏[匈牙利(最大匹配)+枚举]
- HDU-1281 棋盘游戏 二分图匹配匈牙利算法
- HDU 2444 The Accomodation of Students(最大二分匹配(匈牙利算法)+二分图判断->模板题目)
- hdu 1281 棋盘游戏【二分匹配】
- HDU 1281(棋盘游戏)二分匹配+暴力
- HDU 1498 50 years, 50 colors(匈牙利算法 二分最大匹配数)
- hdu 1281 棋盘游戏 (二分匹配)
- hdu 1281 棋盘游戏 (二分匹配)