BZOJ2324 ZJOI2011营救皮卡丘(floyd+上下界费用流)
虽然不一定每次都是由编号小的点向编号大的走,但一个人摧毁的顺序一定是从编号小的到编号大的。那么在摧毁据点x的过程中,其只能经过编号小于x的点。并且这样一定合法,因为可以控制其他人先去摧毁所经过的点。那么可以floyd求出由摧毁x到摧毁y的最短路径。注意这里也需要更新起点编号大于终点的情况,否则floyd会挂掉。
剩下的问题就是用k条路径覆盖所有点使费用最小。那么考虑网络流。可以将每个点拆成入点和出点来控制节点流量至少为1,边权的费用设置为其间最短路径,跑上下界费用流即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 310
#define M 20010
#define S 302
#define T 303
#define in(x) (x<<1)
#define out(x) (x<<1|1)
int n,m,k,p[N],dis[N][N],t=-,ans=;
int d[N],q[N],pre[N];
bool flag[N];
struct data{int to,nxt,cap,flow,cost;
}edge[M<<];
void addedge(int x,int y,int z,int c)
{
t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,edge[t].flow=,edge[t].cost=c,p[x]=t;
t++;edge[t].to=x,edge[t].nxt=p[y],edge[t].cap=,edge[t].flow=,edge[t].cost=-c,p[y]=t;
}
int inc(int &x){x++;if (x>T+) x-=T+;return x;}
bool spfa()
{
memset(d,,sizeof(d));d[S]=;
memset(flag,,sizeof(flag));
int head=,tail=;q[]=S;
do
{
int x=q[inc(head)];flag[x]=;
for (int i=p[x];~i;i=edge[i].nxt)
if (d[x]+edge[i].cost<d[edge[i].to]&&edge[i].flow<edge[i].cap)
{
d[edge[i].to]=d[x]+edge[i].cost;
pre[edge[i].to]=i;
if (!flag[edge[i].to]) q[inc(tail)]=edge[i].to,flag[edge[i].to]=;
}
}while (head!=tail);
return d[T]<=;
}
void ekspfa()
{
while (spfa())
{
int v=k;
for (int i=T;i!=S;i=edge[pre[i]^].to)
v=min(v,edge[pre[i]].cap-edge[pre[i]].flow);
for (int i=T;i!=S;i=edge[pre[i]^].to)
ans+=v*edge[pre[i]].cost,edge[pre[i]].flow+=v,edge[pre[i]^].flow-=v;
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj2324.in","r",stdin);
freopen("bzoj2324.out","w",stdout);
const char LL[]="%I64d\n";
#else
const char LL[]="%lld\n";
#endif
n=read(),m=read(),k=read();
memset(p,,sizeof(p));
memset(dis,,sizeof(dis));
for (int i=;i<=n;i++) dis[i][i]=;
for (int i=;i<=m;i++)
{
int x=read(),y=read(),z=read();
dis[x][y]=dis[y][x]=min(dis[x][y],z);
}
for (int k=;k<=n;k++)
for (int i=;i<=n;i++)
for (int j=;j<=n;j++)
if (i>=k||j>=k) dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
for (int i=;i<n;i++)
for (int j=i+;j<=n;j++)
addedge(out(i),in(j),k,dis[i][j]);
for (int i=;i<=n;i++)
addedge(in(i),out(i),k,);
for (int i=;i<=n;i++)
addedge(in(i),T,,),addedge(S,out(i),,),addedge(out(i),out(n),k,);
addedge(out(n),in(),k,);
ekspfa();
cout<<ans;
return ;
}
BZOJ2324 ZJOI2011营救皮卡丘(floyd+上下界费用流)的更多相关文章
- 【BZOJ2324】[ZJOI2011]营救皮卡丘 有上下界费用流
[BZOJ2324][ZJOI2011]营救皮卡丘 Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的 ...
- 【BZOJ2324】[ZJOI2011]营救皮卡丘(网络流,费用流)
[BZOJ2324][ZJOI2011]营救皮卡丘(网络流,费用流) 题面 BZOJ 洛谷 题解 如果考虑每个人走的路径,就会很麻烦. 转过来考虑每个人破坏的点集,这样子每个人可以得到一个上升的序列. ...
- BZOJ 2324: [ZJOI2011]营救皮卡丘( floyd + 费用流 )
昨晚写的题...补发一下题解... 把1~N每个点拆成xi, yi 2个. 预处理i->j经过编号不超过max(i,j)的最短路(floyd) S->0(K, 0), S->xi(1 ...
- bzoj2324 [ZJOI2011]营救皮卡丘 费用流
[ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2653 Solved: 1101[Submit][Status][D ...
- BZOJ2324: [ZJOI2011]营救皮卡丘
2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1359 Solved: 522[Submit][Stat ...
- BZOJ2324 [ZJOI2011]营救皮卡丘 【费用流】
题目 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道 ...
- 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流
原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...
- bzoj 2324 [ZJOI2011]营救皮卡丘(floyd,费用流)
2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1777 Solved: 712[Submit][Stat ...
- P4542 [ZJOI2011]营救皮卡丘(Floyd+网络流)
P4542 [ZJOI2011]营救皮卡丘 乍一看似乎没啥题相似的 仔细一看,$N<=150$ 边又是双向边,似乎可以用Floyd搞 先跑一遍Floyd处理出$dis[i][j]$ 注意到走 ...
随机推荐
- sparse linear regression with beta process priors
虽然翻译水平有限,但是看原文虽然看得懂,但是在词汇的问题上,会导致看了后面忘了前面,所以先蹩脚的翻译成中文,然后在仔细思考论文的思想(当然不能翻译成中文就不看英文原本了,得两者一起看,这样不会丢失前面 ...
- day38
今日内容: 1.认识数据库 2.修改默认密码 3.常用操作指令 1.认识数据库 什么是MYSQL? 是一个关系型数据库管理系统,基于socket编写的C/S架构的软件 什么是数据库? 数据:用于记录事 ...
- Android漏洞——将Android恶意代码隐藏在图片中
研究人员发现了Android上又一个严重的安全漏洞:将Android恶意代码隐藏在图片中(Hide Android Applications in Images). 在该漏洞向外界公开之前,Googl ...
- WPF Good UI
<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.co ...
- Vue 项目集合
饿了么安全应急响应中心 饿了么招聘 饿了么前端 · GitHub 稀土掘金 异乡好居 明星垂搜 广州建管 基于Vue.js的数据统计系统(一) 基于Vue.js的数据统计系统(二) 基于Vue.js的 ...
- vs如何将工程配置,保存到属性表
上次讲到新建一个opencv工程的配置过程,整个流程下来还是非常麻烦的.每次新建一个工程都要走这个流程的话就要疯了! 现在介绍一种将工程配置,保存到属性表的方法,那么下次新建工程时,只要添加这个属性表 ...
- 双面间谍(spy)
双面间谍 链接 分析: 戳这 代码: #include<cstdio> #include<algorithm> #include<cstdio> #include& ...
- scala学习——(1)scala基础(上)
scala> val x = 1 x: Int = 1 一.值与变量 值(val):赋值后不可变 val值名称:类型 = XXX 变量(var):赋值后可以改变 var变量名称:类型 = XX ...
- 洛咕 P3704 [SDOI2017]数字表格
大力推式子 现根据套路枚举\(\gcd(i,j)\) \(ans=\Pi_{x=1}^nfib[x]^{\sum_{i=1}^{n/x}\sum_{j=1}^{n/x}[\gcd(i,j)=1]}\) ...
- [LOJ#6198]谢特[后缀数组+trie+并查集]
题意 给你一个长度为 \(n\) 的字符串,问 \(LCP(i,j)+(w_i\ xor\ w_j)\) 的最大值,其中 \(LCP\) 表示两个后缀的最长公共前缀. \(n\le 10^5\) 分析 ...