4883: [Lydsy2017年5月月赛]棋盘上的守卫
来源:互联网 发布:seo诊断seo8 编辑:程序博客网 时间:2024/06/06 20:39
4883: [Lydsy2017年5月月赛]棋盘上的守卫
Time Limit: 3 Sec Memory Limit: 256 MB
Submit: 143 Solved: 70
[Submit][Status][Discuss]
Description
在一个n*m的棋盘上要放置若干个守卫。对于n行来说,每行必须恰好放置一个横向守卫;同理对于m列来说,每列
必须恰好放置一个纵向守卫。每个位置放置守卫的代价是不一样的,且每个位置最多只能放置一个守卫,一个守卫
不能同时兼顾行列的防御。请计算控制整个棋盘的最小代价。
Input
第一行包含两个正整数n,m(2<=n,m<=100000,n*m<=100000),分别表示棋盘的行数与列数。
接下来n行,每行m个正整数
其中第i行第j列的数w[i]j表示在第i行第j列放置守卫的代价。
Output
输出一行一个整数,即占领棋盘的最小代价。
Sample Input
3 4
1 3 10 8
2 1 9 2
6 7 4 6
Sample Output
19
HINT
在(1,1),(2,2),(3,1)放置横向守卫,在(2,1),(1,2),(3,3),(2,4)放置纵向守卫。
HINT
Source
鸣谢Claris上传试题
[Submit][Status][Discuss]
把棋子看成个边,行和列看成点
于是就有了一张n+m 个点和n∗m 条边的图
显然,一组合法解中,每个连通块都是一棵环套树
因为都是N 个点N 条边,多一条则无法配对
那么用kruscal 算法解决就行了
#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxn = 1E5 + 10;typedef long long LL;struct E{ int x,y,w; E(){} E(int x,int y,int w): x(x),y(y),w(w){} bool operator < (const E &B) const {return w < B.w;}}edgs[maxn];int n,m,tot,cnt,fa[maxn];bool bo[maxn]; LL Ans;inline int getfa(int k) {return k == fa[k] ? k : fa[k] = getfa(fa[k]);}inline int getint(){ char ch = getchar(); int ret = 0; while (ch < '0' || '9' < ch) ch = getchar(); while ('0' <= ch && ch <= '9') ret = ret * 10 + ch - '0',ch = getchar(); return ret;}int main(){ #ifdef DMC freopen("DMC.txt","r",stdin); #endif n = getint(); m = getint(); for (int i = 1; i <= n; i++) for (int j = 1; j <= m; j++) { int w = getint(); edgs[++cnt] = E(i,j + n,w); } sort(edgs + 1,edgs + cnt + 1); for (int i = 1; i <= n + m; i++) fa[i] = i; for (int i = 1; i <= cnt; i++) { E &e = edgs[i]; int fx = getfa(e.x),fy = getfa(e.y); if (bo[fx] && bo[fy]) continue; if (fx != fy) { Ans += 1LL * e.w; ++tot; fa[fx] = fy; bo[fy] |= bo[fx]; } else { if (bo[fx]) continue; bo[fx] = 1; Ans += 1LL * e.w; ++tot; } if (tot == n + m) break; } cout << Ans << endl; return 0;}
阅读全文
0 0
- 4883: [Lydsy2017年5月月赛]棋盘上的守卫
- BZOJ4883 [Lydsy2017年5月月赛]棋盘上的守卫
- BZOJ4883: [Lydsy2017年5月月赛]棋盘上的守卫
- [BZOJ 4883][Lydsy2017年5月月赛]棋盘上的守卫:最小生成树
- bzoj 4883: [Lydsy2017年5月月赛]棋盘上的守卫 最小生成树
- bzoj 4880: [Lydsy2017年5月月赛]排名的战争
- bzoj4879: [Lydsy2017年5月月赛]失控的数位板
- BZOJ4880 [Lydsy2017年5月月赛]排名的战争
- BZOJ4879: [Lydsy2017年5月月赛]失控的数位板
- BZOJ4880: [Lydsy2017年5月月赛]排名的战争
- 4880: [Lydsy2017年5月月赛]排名的战争
- bzoj4885: [Lydsy2017年5月月赛]长方体
- BZOJ4885: [Lydsy2017年5月月赛]长方体
- bzoj5049 [Lydsy2017年5月月赛]导航系统
- 棋盘上的守卫
- bzoj4878: [Lydsy2017年5月月赛]挑战NP-Hard
- bzoj4881: [Lydsy2017年5月月赛]线段游戏
- BZOJ4884 [Lydsy2017年5月月赛]太空猫
- C++和Java的浅层拷贝与深层拷贝
- 二叉树的遍历
- POJ 1177 Picture 笔记
- 你需要理解的 Java 反射机制知识总结
- Python压缩文件
- 4883: [Lydsy2017年5月月赛]棋盘上的守卫
- 在网页中使用个性字体
- 汇编--学习笔记(四)-DOS功能调用
- VS2010快速调整格式
- <测试架构师修炼之道>读书笔记1
- hdu 3341 Lost's revenge
- 将输入的密码变成*的代码
- 输出正整数二进制的位置(难度:半颗星)
- TCP组包问题