Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal
原文链接http://www.cnblogs.com/zhouzhendong/p/9010945.html
题目传送门 - Codechef STMINCUT
题意
在一个有边权的无向图中,我们定义$S$和$T$的最小割为,要使得不存在$S$和$T$之间的路径需要删去的边的最小边权和。 给定$N×N$的二维数组$A$,你可以令数组的任意元素加上一个非负整数(每个元素加上的数可以不同)。加完后,数组$A$应当满足这一条件:存在$N$个节点的图$G$(节点编号为$1$∼$N$),使 得对于任意$i, j (1 ≤ i, j ≤ N)$,$i$和$j$在图$G$中的最小割恰好为$A_{i,j}$。我们定义上述操作的代价为加上的数字之和。请求出最小代价。
多组数据。
$T\leq 100,N\leq 1000,\sum N\leq 2000,A_{i,j}\leq 10^9$
题解
先大力猜一个结论!!(后面填坑)
最后得到的图是个森林。
考虑到两点之间的最小割就是他们两个之间的树上路径的最小边权(如果不连通那么显然是$0$)。
考虑到如果某一条边是某一个连通块中最小的边,那么这条边连通的两个连通块之间的点对之间的最小割显然是该边的权值。
于是我们考虑从大到小加边。
由于我们要最小化增量,所以我们取的边权就是输入的矩阵中的数字。
显然可以$kruskal$来做。
下面我们分情况讨论:
如果当前要加入的边所对应的两个连通块
$\rightarrow$ 不连通:那么,由于当前加入的边比之前加入的都要小,而当前还没有连通的所有点的最小割都不大于当前边权,所以用当前边连接对应的两个连通块中的任意两个点之后,不改变原来连通块内的最小割,并使得两个连通块之间的任意两点最小割大小提升到当前边权值。考虑到如果使该边的权值更大,显然会亏。
$\rightarrow$ 连通:比如已经存在一条边沟通了两个连通块,并且修改了当前边所连接的两个节点的最小割值,所以当前边已经废了。不管他就可以了。
然后我们只需要把任意两个节点之间的最小割总和算出来,减掉原来的矩阵数总和即可。
然后我们考虑(yy)一下为什么森林是最优的(当然不是森林也可能是最优的)。
开始口胡:
考虑按照最小割需求从大到小做,在连接两个联通块的时候,如果选择连接的边不止一条边,那么每条边的权会比当前最小割需求平均一些。这样会导致一条路径的最小割不一定是新加入的边——由于之前可能已经加入较小的边了。所以我们需要在这个基础上继续添加边(显然已经亏了)。如果之前没有加入“较小的边”,那么新加入的边连接联通块之后,得到的效果和连一条树边效果相同。
所以,最终结果为森林虽然不一定是唯一一个最优结果图,但是一定是最优的。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2005;
int T,n,a[N][N],fa[N],size[N];
LL ans,tot;
struct Point{
int x,y;
Point(){}
Point(int _x,int _y){
x=_x,y=_y;
}
}v[N*N];
int getf(int x){
return fa[x]==x?x:fa[x]=getf(fa[x]);
}
bool cmp(Point x,Point y){
return a[x.x][x.y]>a[y.x][y.y];
}
int main(){
scanf("%d",&T);
while (T--){
scanf("%d",&n);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
v[(i-1)*n+j]=Point(i,j);
}
sort(v+1,v+n*n+1,cmp);
for (int i=1;i<=n;i++)
fa[i]=i,size[i]=1;
ans=tot=0;
for (int i=1;i<=n*n;i++){
int x=getf(v[i].x),y=getf(v[i].y);
if (x==y)
continue;
ans+=1LL*a[v[i].x][v[i].y]*size[x]*size[y];
size[x]+=size[y],fa[y]=x;
}
ans*=2;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
ans-=a[i][j];
printf("%lld\n",ans);
}
return 0;
}
Codechef STMINCUT S-T Mincut (CodeChef May Challenge 2018) kruskal的更多相关文章
- Codechef October Challenge 2018 游记
Codechef October Challenge 2018 游记 CHSERVE - Chef and Serves 题目大意: 乒乓球比赛中,双方每累计得两分就会交换一次发球权. 不过,大厨和小 ...
- Codechef September Challenge 2018 游记
Codechef September Challenge 2018 游记 Magician versus Chef 题目大意: 有一排\(n(n\le10^5)\)个格子,一开始硬币在第\(x\)个格 ...
- Codeforces Avito Code Challenge 2018 D. Bookshelves
Codeforces Avito Code Challenge 2018 D. Bookshelves 题目连接: http://codeforces.com/contest/981/problem/ ...
- Lyft Level 5 Challenge 2018 - Final Round (Open Div. 2) (前三题题解)
这场比赛好毒瘤哇,看第四题好像是中国人出的,怕不是dllxl出的. 第四道什么鬼,互动题不说,花了四十五分钟看懂题目,都想砸电脑了.然后发现不会,互动题从来没做过. 不过这次新号上蓝名了(我才不告诉你 ...
- codechef February Challenge 2018 简要题解
比赛链接:https://www.codechef.com/FEB18,题面和提交记录是公开的,这里就不再贴了 Chef And His Characters 模拟题 Chef And The Pat ...
- Codechef CHSIGN Change the Signs(May Challenge 2018) 动态规划
原文链接http://www.cnblogs.com/zhouzhendong/p/9004583.html 题目传送门 - Codechef CHSIGN 题意 第一行,一个数$T$,表示数据组数. ...
- Codechef August Challenge 2018 : Chef at the River
传送门 (要是没有tjm(Sakits)的帮忙,我还真不知道啥时候能做出来 结论是第一次带走尽可能少的动物,使未带走的动物不冲突,带走的这个数量就是最优解. 首先这个数量肯定是下界,更少的话连第一次都 ...
- Codechef August Challenge 2018 : Safe Partition
传送门 (虽然是A了但是不知道复杂度是不是正确的 考虑以某个位置为结尾的合法划分 先考虑min,带来的影响是限制了最小长度,预处理出这个最小长度后,这可以在处理到这个数时,把不能算的部分去掉(不满足m ...
- Codechef August Challenge 2018 : Interactive Matrix
传送门 首先整个矩阵可以被分为很多小矩阵,小矩阵内所有行的单调性是一样的,所有列的单调性是一样的. 考虑如何在这样一个小矩阵中找出答案.我的策略是每次取四个角中最大值和最小值的点,这样可以每次删掉一行 ...
随机推荐
- windows修复分区卷:chkdsk
问题描述: 共享磁盘上传文件到服务器报错:一个意外错误使你无法复制该文件夹.如果你继续收到此错误,可以使用错误代码来搜索有关问题的帮助,错误 0x800703E3:由于线程退出或应用程序请求,已终止I ...
- sysstat-----获取服务器负载历史记录
sysstat工具与负载历史回放 很多系统负载过高的时候我们是无法立即获知或者立即解决的,当检测到或者知道历史的高负载状况时,可能需要回放历史监控数据,这时 sar 命令就派上用场了,sar命令同样来 ...
- 如何快速定位找出SEGV内存错误的程序Bug
通过查看php日志/usr/local/php/var/log/php-fpm.log,有如下警告信息: [16-Mar-2015 16:03:09] WARNING: [pool www] chil ...
- js——class基础
js的类?其实还是原型! class Point{ constructor(x, y){ this.x = x; this.y = y; } toString(){ return '(' + this ...
- winform无需安装pdf阅读器打开pdf文件
控件来源:http://www.o2sol.com/pdfview4net/download.htm (使用版本:2016年8月31号更新版) 备份链接: https://pan.baidu.com/ ...
- 基于vue-cli3的vue项目移动端样式适配,lib-flexible和postcss-px2rem
1,安装 flexible和 postcss-px2rem(命令行安装) npm install lib-flexible --save npm install postcss-px2rem --sa ...
- android组件之TabHost
一 介绍 1.1 TAB的容器.这个对象包含两个子元素: TabWidget:管理标签(tabs),用户点击来选择一个特定的标签,是它告诉TabHost去切换界面的 FrameLayout:对象显示该 ...
- css之操作属性
1.文本 1.文本颜色:color 颜色属性被用来设置文字的颜色. 颜色是通过CSS最经常的指定: 十六进制值 - 如: #FF0000 一个RGB值 - 如: RGB(255,0,0) 颜色的名称 ...
- 如何使用PowerShell批量删除Office 365的用户
概述 本文将演示如何在必要的时候(例如在测试环境),通过PowerShell脚本批量删除Office 365的用户,首先需要通过Get-MsolUser的命令(并且配合筛选条件)获取到符合条件的用户列 ...
- Git使用一:git客户端安装与创建用户
1.下载并安装Git和图形客户端TortoiseGit Git官网:https://gitforwindows.org/ TortoiseGit官网: https://tortoisegit.org/ ...