这道题么= =还是有些恶心的,第一次写带上下界的网络流,整个人都萌萌哒~~~

首先先预处理得最短路后

直接用费用流做就行了。

第一次写,还是挺好写的= =

CODE:

#include<cstdio>

#include<iostream>

#include<algorithm>

#include<cstring>

#include<queue>

using namespace std;

#define maxn 310

#define maxm 100000

struct edges{

int to,next,cap,dist;

}edge[maxm];

int next[maxn],l;

void addedge(int x,int y,int z,int d){

l++;

edge[l*2]=(edges){y,next[x],z,d};next[x]=l*2;

edge[l*2+1]=(edges){x,next[y],0,-d};next[y]=l*2+1;

}

int inf;

int dist[maxn],w[maxn],s,t,cnt;

bool b[maxn];

queue<int> q;

bool spfa() {

for (int i=1;i<=cnt;i++) dist[i]=inf;

dist[s]=0;

q.push(s);

while (!q.empty()) {

int u=q.front();q.pop();

b[u]=0;

for (int i=next[u];i;i=edge[i].next)

if (edge[i].cap&&edge[i].dist+dist[u]<dist[edge[i].to]) {

dist[edge[i].to]=dist[u]+edge[i].dist;

w[edge[i].to]=i;

if (!b[edge[i].to]) {

b[edge[i].to]=1;

q.push(edge[i].to);

}

}

}

return dist[t]!=inf;

}

int ans;

int mcmf(int ss,int tt){

s=ss,t=tt;

while (spfa()) {

int x=t,flow=inf;

while (x!=s) {

flow=min(flow,edge[w[x]].cap);

x=edge[w[x]^1].to;

}

ans+=flow*dist[t];

x=t;

while (x!=s) {

edge[w[x]].cap-=flow;

edge[w[x]^1].cap+=flow;

x=edge[w[x]^1].to;

}

}

}

int dis[maxn][maxn],f[maxn][maxn],id[maxn][2];

int main(){

int n,m,k;

scanf("%d%d%d",&n,&m,&k);

memset(f,10,sizeof(f));

inf=f[0][0];

for (int i=1;i<=m;i++) {

int x,y,z;

scanf("%d%d%d",&x,&y,&z);

f[x][y]=f[y][x]=min(f[x][y],z);

}

for (int i=0;i<=n;i++) f[i][i]=0;

for (int k=0;k<=n;k++) {

for (int i=0;i<=n;i++)

for (int j=0;j<=n;j++)

f[i][j]=min(f[i][j],f[i][k]+f[k][j]);

for (int i=0;i<=n;i++) dis[i][k]=f[i][k];

}

for (int i=0;i<=n;i++) id[i][0]=++cnt;

for (int i=0;i<=n;i++) id[i][1]=++cnt;

int s=++cnt,t=++cnt;

addedge(id[0][0],id[0][1],k,0);

for (int i=1;i<=n;i++) {

addedge(id[0][1],id[i][0],inf,dis[0][i]);

addedge(id[i][1],id[n][1],inf,0);

addedge(id[i][0],id[i][1],inf,0);

addedge(s,id[i][1],1,0);

addedge(id[i][0],t,1,0);

}

for (int i=0;i<n;i++)

for (int j=i+1;j<=n;j++)

if (dis[i][j]!=inf) addedge(id[i][1],id[j][0],inf,dis[i][j]);

addedge(id[n][1],id[0][0],inf,0);

mcmf(s,t);

next[s]=next[t]=0;

next[id[n][1]]=edge[next[id[n][1]]].next;

next[id[0][0]]=edge[next[id[0][0]]].next;

mcmf(id[0][0],id[n][1]);

printf("%d\n",ans);

return 0;

}

转载于:https://www.cnblogs.com/New-Godess/p/4348905.html

BZOJ 2324: [ZJOI2011]营救皮卡丘(带上下限的最小费用最大流)相关推荐

  1. [bzoj2324][ZJOI2011]营救皮卡丘

    来自FallDream的博客,未经允许,请勿转载,谢谢. 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的 ...

  2. 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...

  3. 有上下限的最小费用可行流

    例题 BZOJ 3876 题意,有N个点,并且有一些边,每个点必须要经过一次,但是不限经过次数,也就是有下界的情况,且下界为1,现在每次的起点都是1,问至少花费的代价,使得每次从1开始,终点不限的情况 ...

  4. [ZJOI2011]营救皮卡丘(费用流 + 最短路)

    problem luogu-P4542 solution 刚开始就直观感觉 dpdpdp 不动,却有个看似"理所当然"的贪心:每次跑 kkk 个人所在点到扩展据点的最短距离,然后让 ...

  5. bzoj 4108: [Wf2015]Catering|带上下界最小费用可行流

    终于搞懂 上下界网络流了! 注意边的数量 #include <cstdio> #include <cstring> #include <iostream> #inc ...

  6. BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理

    准备一周多的期末,各种爆炸,回来后状态下滑巨快...调了一晚上+80%下午 2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MB ...

  7. [BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘

    [Problem Description] 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队 ...

  8. 带权二分图匹配(最小费用最大流) 8.2牛客暑期多校训练营五 E

    E.room | 时间限制:1 秒 | 内存限制:256M Nowcoder University has 4n students and n dormitories ( Four students ...

  9. P4542-[ZJOI2011]营救皮卡丘【费用流,Floyd】

    正题 题目链接:https://www.luogu.com.cn/problem/P4542 题目大意 给出n+1n+1n+1个点mmm条边的无向图,kkk个人开始在000号点,一个人进入iii号点之 ...

最新文章

  1. Maria数据库怎么复制到mysql_maria(mysql)的主从复制
  2. ubuntu 下非交互式执行远程shell命令
  3. 下半部机制之工作队列
  4. 【MATLAB统计分析与应用100例】案例005:matlab调用medfilt1函数对加噪正弦波信号进行平滑处理
  5. 一文读懂 | 进程并发与同步
  6. java静态链表_静态链表及其创建(C语言实现)
  7. mongodb集群分片环境搭建
  8. 使用minidom来处理XML的示例(Python 学习)(转载)
  9. c#操作斑马打印机打印中文
  10. win10熄屏时间不对_详解win10屏幕熄屏时间设置教程
  11. 国内能使用的海外支付接口除了Stripe,Paypal还有哪些?
  12. Pytest测试框架(二):pytest 的setup/teardown方法
  13. java中flist cannot_cannot
  14. 为什么罗永浩这种人都能做出来锤子手机?
  15. XML文件生成XSD文件的方法
  16. 【牛客网】C语言入门 - CC3 编写函数实现两数交换(指针方式)
  17. CAS:73342-16-2,Azide-PEG-Hydroxy,N3-PEG-OH,叠氮PEG羟基
  18. php 判断应用是否安装,一个判断oicq是否在线的小程序-PHP教程,PHP应用
  19. android串口通信
  20. 实时内核:可剥夺型与不可剥夺型

热门文章

  1. React开发(281):一定是路由错误
  2. 前端学习(3229):React中的事件处理
  3. [html] 如何构建“弱网络环境”友好的项目?
  4. [html] 请问60*80的canvas占多少内存?你是怎么计算的?
  5. [css] 用CSS实现tab切换
  6. [vue-element] ElementUI怎么修改组件的默认样式?
  7. 前端学习(2521):设定添加博客和最终效果展示
  8. 工作56:element里面表单重置
  9. shiro学习(24):Spring的transaction-manager的用法
  10. spring mvc学习(44):springMVC运行原理