BZOJ 3691 游行
题目传送门
分析:
没被访问的点要C费用,跑一次路要C费用
把这两个统一一下试试。。。
那就是每次不标记起点或者终点
那就是路径覆盖了2333
二分图,x 部 i 号点与 y 部 j 号点连 i 到 j 的最短路
然后每个点都会被访问到
但是有些的代价会大于C
那些就干脆不访问了吧2333
看看费用流的函数特征
是一个单增函数
某一刻一单位流的代价大于了C,那就可以停止了
由于C会变,先求出整个的费用流函数,每次二分查找就好了
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue> #define maxn 2005
#define maxm 200005
#define INF 0x3f3f3f3f using namespace std; inline int getint()
{
int num=,flag=;char c;
while((c=getchar())<''||c>'')if(c=='-')flag=-;
while(c>=''&&c<='')num=num*+c-,c=getchar();
return num*flag;
} int n,m,Q;
int S,T;
int fir[maxn],nxt[maxm],to[maxm],cnt;
int cap[maxm],cst[maxm];
int dis[maxn];
int vis[maxn],pre[maxn];
int sum[maxn],tot;
int D[maxn][maxn]; inline void newnode(int u,int v,int w,long long c)
{to[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt,cap[cnt]=w,cst[cnt]=c;}
inline void insert(int u,int v,int w,long long c)
{newnode(u,v,w,c),newnode(v,u,,-c);} inline bool spfa()
{
memset(dis,INF,sizeof dis);dis[S]=;
memset(pre,-,sizeof pre);
queue<int>Q;Q.push(S),vis[S]=;
while(!Q.empty())
{
int u=Q.front();Q.pop();vis[u]=;
for(int i=fir[u];i;i=nxt[i])
if(cap[i]&&dis[to[i]]>dis[u]+cst[i])
{
dis[to[i]]=dis[u]+cst[i];pre[to[i]]=i^;
if(!vis[to[i]])vis[to[i]]=,Q.push(to[i]);
}
}
return ~pre[T];
} inline int dinic()
{
int num=;
while(spfa())
{
tot++;
sum[tot]=sum[tot-];
int mn=INF;
for(int i=pre[T];i!=-;i=pre[to[i]])mn=min(mn,cap[i^]);
int tmp=;
for(int i=pre[T];i!=-;i=pre[to[i]])cap[i]+=mn,cap[i^]-=mn,tmp+=cst[i^];
sum[tot]+=tmp*mn,num+=mn;
}
return num;
} int main()
{
n=getint(),m=getint(),Q=getint();
S=n*+,T=S+,cnt=;
memset(D,INF,sizeof D);
for(int i=;i<=n;i++)D[i][i]=;
for(int i=;i<=m;i++)
{
int u=getint(),v=getint();
D[u][v]=min(getint(),D[u][v]);
}
for(int k=;k<=n;k++)for(int i=;i<=n;i++)for(int j=;j<=n;j++)
D[i][j]=min(D[i][j],D[i][k]+D[k][j]);
for(int i=;i<=n;i++)insert(S,i,,),insert(i+n,T,,);
for(int i=;i<=n;i++)for(int j=;j<=n;j++)if(i^j)insert(i,j+n,,D[i][j]);
dinic();
while(Q--)
{
int C=getint(),l=,r=tot,ans=;
while(l<=r)
{
int mid=(l+r)>>;
if(sum[mid]-sum[mid-]<C)l=mid+,ans=mid;
else r=mid-;
}
printf("%d\n",sum[ans]+(n-ans)*C);
}
}

BZOJ 3691 游行的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 【BZOJ3691】游行(网络流)
[BZOJ3691]游行(网络流) 题面 BZOJ 然而权限题. Description 每年春季,在某岛屿上都会举行游行活动. 在这个岛屿上有N个城市,M条连接着城市的有向道路. 你要安排英雄们的巡 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
- BZOJ 3275: Number
3275: Number Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 874 Solved: 371[Submit][Status][Discus ...
- BZOJ 2879: [Noi2012]美食节
2879: [Noi2012]美食节 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1834 Solved: 969[Submit][Status] ...
- bzoj 4610 Ceiling Functi
bzoj 4610 Ceiling Functi Description bzoj上的描述有问题 给出\(n\)个长度为\(k\)的数列,将每个数列构成一个二叉搜索树,问有多少颗形态不同的树. Inp ...
- BZOJ 题目整理
bzoj 500题纪念 总结一发题目吧,挑几道题整理一下,(方便拖板子) 1039:每条线段与前一条线段之间的长度的比例和夹角不会因平移.旋转.放缩而改变,所以将每条轨迹改为比例和夹角的序列,复制一份 ...
- 【sdoi2013】森林 BZOJ 3123
Input 第一行包含一个正整数testcase,表示当前测试数据的测试点编号.保证1≤testcase≤20. 第二行包含三个整数N,M,T,分别表示节点数.初始边数.操作数.第三行包含N个非负整数 ...
- 【清华集训】楼房重建 BZOJ 2957
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
随机推荐
- vue-learning:6-template-v-bind
绑定元素特性的指令v-bind 回顾下,从HTML元素的结构看,在VUE框架中,内容由插值{{ }}和v-html绑定:v-if和v-show可以控制元素的可见性:v-for可以用于批量生成列表元素. ...
- Sending Packets LightOJ - 1321 (期望计算)
题面: Alice and Bob are trying to communicate through the internet. Just assume that there are N route ...
- Channel 9视频整理【6】
GiGi Huang https://channel9.msdn.com/Niners/GiGiHuang
- python监控模块
pip install psutil 获取内存信息: >>> import psutil >>> mem = psutil.virtual_memory() #获取 ...
- Excel特殊符号的录入与录入的秘诀
软键盘就是输入法上的软键盘 右键单击软键盘 右键! 通过code函数得到符号的数字 按住alt键然后输入数字才可以得到符号 注意是在数字键盘 右边数字键盘区域 插入特殊符号 跳转方向的设置 如果超过 ...
- 大白话讲解Spring的@bean注解
1.Spring注解分类 从广义上Spring注解可以分为两类: 一类注解是用于注册Bean 假如IOC容器就是一间空屋子,首先这间空屋子啥都没有,我们要吃大餐,我们就要从外部搬运食材和餐具进来.这里 ...
- iptables限速
####限速 限制指定时间包的允许通过数量及并发数-m limit --limit n/{second/minute/hour}:指定时间内的请求速率"n"为速率,后面为时间分别为 ...
- Linux学习之路--简介
1 Linux简介 UNIX与Linux发展史 Unix在1969年,美国贝尔实验室的肯汤普森在DEC PDP-7机器上开发出了UNIX系统.Linux出现于1991年,是由芬兰赫尔辛基大学学生李纳斯 ...
- 「SP122」STEVE - Voracious Steve 解题报告
SP122 STEVE - Voracious Steve 题意翻译 Problem Steve和他的一个朋友在玩游戏,游戏开始前,盒子里有 n个甜甜圈,两个人轮流从盒子里抓甜甜圈,每次至少抓 1个, ...
- 【自建gitlab服务器】gitlab内存持续增大,出现502错误的解决办法
首先说明笔者的服务器环境,阿里云服务器:8G内存,2核.自从团队运维小伙伴搭建了gitlab之后,git push 代码时不时的就很卡,也经常出现 gitlab 反应超时,返回502错误,严重阻塞了团 ...