【BZOJ4950】lydsy七月月赛 C 二分图最大匹配
2017-07-31 20:15
288 查看
【BZOJ4950】lydsy七月月赛 C
题面题解:比较直接的想法就是:每行,每列的最大值都留下,剩下的格子都变成1。但是如果一个格子既是行的最大值又是列的最大值,那么我们只需要把它留下即可。这就变成了一个二分图最大匹配问题,乱搞即可。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; int n,m,cnt,now; ll ans; ll map[110][110],s1[110],s2[110]; int to[10010],next[10010],head[110],vis[110],from[110]; void add(int a,int b) { to[++cnt]=b,next[cnt]=head[a],head[a]=cnt; } int dfs(int x) { for(int i=head[x];i;i=next[i]) { if(vis[to[i]]) continue; vis[to[i]]=1; if(!from[to[i]]||dfs(from[to[i]])) { from[to[i]]=x; return 1; } } return 0; } int main() { scanf("%d%d",&n,&m); int i,j; for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%lld",&map[i][j]),s1[i]=max(s1[i],map[i][j]),s2[j]=max(s2[j],map[i][j]),ans+=map[i][j]; for(i=1;i<=n;i++) for(j=1;j<=m;j++) { if(map[i][j]) { ans--; if(s1[i]>1&&s1[i]==s2[j]) add(i,j); } } for(i=1;i<=n;i++) if(s1[i]) ans-=s1[i]-1; for(i=1;i<=m;i++) if(s2[i]) ans-=s2[i]-1; for(i=1;i<=n;i++) if(s1[i]) memset(vis,0,sizeof(vis)),ans+=dfs(i)*(s1[i]-1); printf("%lld",ans); return 0; }
相关文章推荐
- BZOJ 4950 Mission Improbable (二分图最大匹配)
- bzoj4950 [Wf2017]Mission Improbable(二分图最大匹配)
- [BZOJ]4950 二分图 + 最大匹配
- BZOJ 4950 [Wf 2017] 二分图最大匹配 解题报告
- 【bzoj4950】[Wf2017]Mission Improbable 二分图最大匹配
- bzoj 4950(二分图最大匹配)
- [二分图最大匹配必配点] BZOJ 3546 [ONTAK2010]Life of the Party
- 【bzoj4554】[Tjoi2016&Heoi2016]游戏 二分图最大匹配
- 【BZOJ 3308】 3308: 九月的咖啡店 (费用流|二分图最大权匹配)
- [BZOJ1191][HNOI2006]超级英雄Hero 类似二分图的最大匹配
- 【bzoj4443】【[Scoi2015]小凸玩矩阵】二分+二分图最大匹配
- 【BZOJ1854】【codevs3358】游戏,二分图最大匹配
- BZOJ1191(HNOI2006)[超级英雄Hero]--二分图最大匹配
- 【bzoj4443】【[Scoi2015]小凸玩矩阵】二分+二分图最大匹配
- BZOJ 1854 [Scoi2010]游戏 二分图最大匹配
- BZOJ1143 祭祀river [二分图最大匹配]
- BZOJ 4881 [Lydsy2017年5月月赛] 二分图染色+线段树
- [BZOJ]4443 [SCOI2015] 小凸玩矩阵 二分答案 + 二分图最大匹配
- BZOJ 3140 消毒 (二进制枚举降维 二分图最大匹配)
- 【bzoj4443】[Scoi2015]小凸玩矩阵 二分+二分图最大匹配