问题描述

一张 \(N\) 个点无向图,边权都为 \(1\) ,添加若干条边,最小化 \(\sum\limits_{1 \le i \le n,i \in N_{+}}{(a_i-b_i)^2}\)。 \(b_i\) 是输入的, \(a_i\) 是 \(1\) 号点到 \(i\) 号点的最短路。

submit


题解

添加边后, \(a_i\) 不会变小。

\(a_i\) 就是离散变量。

原来有边的两个点 \(x,y\) 的最短路长度差值不会超过 \(1\) 。


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; const int INF=0x3f3f3f3f; //#define local
//#define file int n,b[47],S,T;
char s[47][47]; int Head[2507],d[2507];
int to[500007],Next[500007],w[500007],tot=1; void addedge(int x,int y,int z){
to[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;
} void add(int x,int y,int z){
addedge(x,y,z);addedge(y,x,0);
} void Init(void){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%s",s[i]+1);
for(int i=1;i<=n;i++) scanf("%d",&b[i]);
} int dis[2507],sum[2507];
bool vis[2507];
#define pii(x,y) make_pair(x,y) void dijkstra(){
memset(dis,0x3f,sizeof(dis));
priority_queue < pair<int,int> > q;
dis[1]=0;q.push(pii(0,1));
while(!q.empty()){
int x=q.top().second;q.pop();
if(vis[x]) continue;
vis[x]=1;
for(int i=1;i<=n;i++){
if(s[x][i]=='N') continue;
if(dis[i]>dis[x]+1){
dis[i]=dis[x]+1;
q.push(pii(-dis[i],i));
}
}
}
} int id(int x,int y){
return (x-1)*n+y;
} void debug(void){
for(int i=2;i<=tot;i+=2){
printf("-- From %d to %d w = %d \n",to[i^1],to[i],w[i]);
}
printf("## S = %d , T = %d\n",S,T);
} void Graph_build(void){
// dijkstra();
// for(int i=1;i<=n;i++) sum[i]=sum[i-1]+dis[i]+1;
S=n*n+1,T=S+1;
add(1,T,INF);//错误笔记:1号点最短路为零,为了防止S->1->T不能正常加边,但是1->T还是得加
for(int i=2;i<=n;i++){
add(S,id(i,1),INF);
for(int j=1;j<n;j++){
int price=(j-b[i])*(j-b[i]);
add(id(i,j),id(i,j+1),price);
}
add(id(i,n),T,INF);
}
for(int x=1;x<=n;x++){
for(int y=1;y<=n;y++){
if(s[x][y]=='N') continue;
// int lim=min(dis[x],dis[y]);
for(int i=1;i<n;i++){
add(id(x,i+1),id(y,i),INF);
}
}
}
// debug();
} bool bfs(void){
memset(d,0,sizeof(d));
queue<int>q;q.push(S);d[S]=1;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(d[y]||!w[i]) continue;
d[y]=d[x]+1;q.push(y);
if(y==T) return true;
}
}
return false;
} int dfs(int x,int flow){
if(x==T) return flow;
int rest=flow;
for(int i=Head[x];i;i=Next[i]){
int y=to[i];
if(d[y]!=d[x]+1||!w[i]) continue;
int k=dfs(y,min(rest,w[i]));
if(!k) d[y]=0;
else w[i]-=k,w[i^1]+=k,rest-=k;
}
return flow-rest;
} int Dinic(void){
int res(0),t;
while(bfs()){
while(t=dfs(S,INF)) res+=t;
}
return res;
} int Work(void){
Graph_build();
return Dinic();
} #ifndef local
class FoxAndCity{
public:
int minimalCost(vector<string>str,vector<int>in){
n=str[0].size();
for(int i=0;i<n;i++){
b[i+1]=in[i];
for(int j=0;j<n;j++){
s[i+1][j+1]=str[i][j];
}
}
return Work();
}
};
#endif #ifdef local
int main(){
#ifdef file
freopen("hzlbn.in","r",stdin);
#endif
Init();
printf("%d\n",Work());
return 0;
}
#endif

TopCoder12727 「SRM590Hard」FoxAndCity 最小割离散变量模型的更多相关文章

  1. BZOJ3144/LG3227 「HNOI2013」切糕 最小割离散变量模型

    问题描述 BZOJ3144 LG3227 还想粘下样例 输入: 2 2 2 1 6 1 6 1 2 6 2 6 输出: 6 题解 关于离散变量模型,我不想再抄一遍,所以: 对于样例,可以建立出这样的图 ...

  2. Codechef RIN 「Codechef14DEC」Course Selection 最小割离散变量模型

    问题描述 提供中文版本好评,一直以为 Rin 是题目名字... pdf submit 题解 参考了 东营市胜利第一中学姜志豪 的<网络流的一些建模方法>(2016年信息学奥林匹克中国国家队 ...

  3. 【BZOJ 3232】圈地游戏 二分+SPFA判环/最小割经典模型

    最小割经典模型指的是“一堆元素进行选取,对于某个元素的取舍有代价或价值,对于某些对元素,选取后会有额外代价或价值”的经典最小割模型,建立倒三角进行最小割.这个二分是显然的,一开始我也是想到了最小割的那 ...

  4. LG1345 「USACO5.4」Telecowmunication 最小割

    问题描述 LG1345 题解 点边转化,最小割,完事. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; tem ...

  5. 「跬步千里」详解 Java 内存模型与原子性、可见性、有序性

    文题 "跬步千里" 主要是为了凸显这篇文章的基础性与重要性(狗头),并发编程这块的知识也确实主要围绕着 JMM 和三大性质来展开. 全文脉络如下: 1)为什么要学习并发编程? 2) ...

  6. 【LA3487】最小割-经典模型 两种方法

    题目链接 题意:A.B两个公司要买一些资源(他们自己买的资源不会重复),一个资源只能卖给一个公司.问最大收益. simple input 部分: 54 1 //买到1就给54元 15 2 33 3 2 ...

  7. LOJ #2205. 「HNOI2014」画框 解题报告

    #2205. 「HNOI2014」画框 最小乘积生成树+KM二分图带权匹配 维护一个\((\sum A,\sum B)\)的匹配下凸包,答案在这些点中产生. 具体的,凸包两端可以直接跑单独的\(A\) ...

  8. 【BZOJ-1324】Exca王者之剑 最小割

    1324: Exca王者之剑 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 483  Solved: 248[Submit][Status][Disc ...

  9. [置顶] [BZOJ]2127: happiness 最小割

    happiness: Description 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己 ...

随机推荐

  1. Python3 类与对象

    目录 面向对象基础 面向过程编程 面向对象编程 类 什么是类 如何定义类 类的基本操作 对象 实例化对象 对象添加特有属性 对象与类的查找顺序 对象的绑定方法 面向对象基础 面向过程编程 面向过程的核 ...

  2. 【玩转SpringBoot】用好条件相关注解,开启自动配置之门

    自动配置隐含两层含义,要搞清楚 上帝让程序员的发量减少,是为了让他变得更聪明,如果有一天聪明到了极点,那就是绝顶聪明. 据说在大脑高速运转下,这样更有利于散热,不至于核心温度过高而产生告警. 聪明的大 ...

  3. 【CentOS7】常用命令

    [CentOS7]常用命令 转载:https://www.cnblogs.com/yangchongxing/p/10646640.html 目录 ========================== ...

  4. 自建邮件服务器域名解析设置(A与MX记录)

    自建邮件服务器域名解析设置(A与MX记录) 前言 如果域名没有做解析,只能用于内网收发邮件.要想实现与外网邮箱的收发,需要做域名解析.是在"域名解析后台"进行设置(域名提供商提供& ...

  5. webpack学习2.1 模块化开发(JS模块化&CSS模块化)

    一.JS模块化 命名空间,COMMONJS,AMD/CMD/UMD,ES6 module 1.什么是命名空间 库名.类别名.方法名 弊端:在命名空间重复生命,要记住完整的路径名(而且很长) var N ...

  6. Mysql数据库的主从与主主

    前言: 首先,我们得知道我们为什么要做数据库的主从与主主,而后,再讨论他们的优劣与特点:为什么要做主从呢?因为Mysql数据库没有增量备份的机制,当数据量太大的时候备份是个难以解决的问题.但是mysq ...

  7. Java-50个关键字

    关键字 (50个,包含2个保留字)和特殊值(3个)一.基本数据类型相关关键字(8个) 1.关键字介绍(1)byte:单字节类型(2)short:短整型(3)int:整型(4)long:长整型(5)ch ...

  8. UWP 更强大的文件获取能力

    默认情况下,通用 Windows 平台 (UWP) 应用可以访问特定文件系统位置. 应用也可以通过文件选取器或通过声明功能访问其他位置. 在创建新的应用时,默认情况下你可以访问以下文件系统位置: 1. ...

  9. Another git process seems to be running in this repository

    今天在推送项目的时候git突然报如题的错误.查了一下是由于git被另外一个程序占用,产生原 原因在于Git在使用过程中遭遇了崩溃,部分被上锁资源没有被释放. 解决方案也很简单,在git中找到对应的in ...

  10. delete误删数据使用SCN恢复

    参考51CTO博客 问题描述:使用scn号恢复误删数据 1.查询系统闪回的scn值以及当前日志的scn值,因为我这个是测试,创建的表是在在后边,所以scn值要大于下边这两个scn值,所以对我恢复数据没 ...