bzoj2324营救皮卡丘
费用流。
建图比较重要。
1.S->id[0][0] flow=k。 表示k条路径。
2.S->id[i][0] flow=1, 每次消耗1流量就补充1流量。
3.id[i][1]->T flow=1, 保证每个点都经过一次。
4.id[i][0]->id[j][1] 存在一条路。
这样建图每个点都会被经过一次,而且都是从编号小的点转移过来,满足题目条件。
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 500 + 10;
const int maxm = 100000 + 10;
const int inf = 0x3f3f3f3f; int g[maxn],v[maxm],next[maxm],f[maxm],c[maxm],eid;
int G[maxn][maxn];
int n,m,k,S,T;
int id[maxn][2],vid;
int dist[maxn],pre[maxn];
bool inque[maxn];
int q[maxm]; void addedge(int a,int b,int F,int C) {
v[eid]=b; f[eid]=F; c[eid]= C; next[eid]=g[a]; g[a]=eid++;
v[eid]=a; f[eid]=0; c[eid]=-C; next[eid]=g[b]; g[b]=eid++;
} void build() {
scanf("%d%d%d",&n,&m,&k);
memset(G,0x3f,sizeof(G));
memset(g,-1,sizeof(g));
for(int i=0;i<=n;i++) G[i][i]=0;
for(int i=1,a,b,l;i<=m;i++) {
scanf("%d%d%d",&a,&b,&l);
if(G[a][b]>l) G[a][b]=G[b][a]=l;
}
for(int i=0;i<=n;i++) {
id[i][0]=++vid;
id[i][1]=++vid;
}
S=++vid; T=++vid;
addedge(S,id[0][0],k,0);
for(int i=1;i<=n;i++) {
addedge(S,id[i][0],1,0);
addedge(id[i][1],T,1,0);
}
for(int k=0;k<=n;k++)
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++) {
G[i][j]=min(G[i][j],G[i][k]+G[k][j]);
if(k==j && i<j && G[i][j]<inf) {
addedge(id[i][0],id[j][1],inf,G[i][j]);
}
}
} bool SPFA() {
int u,l,r;
memset(dist,0x3f,sizeof(dist));
dist[S]=0;
l=r=0;
q[r++]=S; while(l<r) {
inque[u=q[l++]]=0;
for(int i=g[u];~i;i=next[i]) {
if(f[i] && dist[v[i]]>dist[u]+c[i]) {
dist[v[i]]=dist[u]+c[i];
pre[v[i]]=i;
if(!inque[v[i]]) inque[q[r++]=v[i]]=1;
}
}
}
return dist[T]<inf;
} int augment() {
int aug=inf,res=0;
for(int i=T;i!=S;i=v[pre[i]^1]) aug=min(aug,f[pre[i]]);
for(int i=T;i!=S;i=v[pre[i]^1]) {
f[pre[i]]-=aug;
f[pre[i]^1]+=aug;
res+=c[pre[i]]*aug;
}
return res;
} void solve() {
int res=0;
while(SPFA()) res+=augment();
printf("%d\n",res);
} int main() {
build();
solve();
return 0;
}
bzoj2324营救皮卡丘的更多相关文章
- BZOJ-2324 营救皮卡丘 最小费用可行流+拆下界+Floyd预处理
准备一周多的期末,各种爆炸,回来后状态下滑巨快...调了一晚上+80%下午 2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MB ...
- 【BZOJ2324】[ZJOI2011]营救皮卡丘(网络流,费用流)
[BZOJ2324][ZJOI2011]营救皮卡丘(网络流,费用流) 题面 BZOJ 洛谷 题解 如果考虑每个人走的路径,就会很麻烦. 转过来考虑每个人破坏的点集,这样子每个人可以得到一个上升的序列. ...
- 【BZOJ2324】[ZJOI2011]营救皮卡丘 有上下界费用流
[BZOJ2324][ZJOI2011]营救皮卡丘 Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的 ...
- BZOJ2324: [ZJOI2011]营救皮卡丘
2324: [ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1359 Solved: 522[Submit][Stat ...
- [BZOJ2324][ZJOI2011][最小费用最大流]营救皮卡丘
[Problem Description] 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队 ...
- 【bzoj2324】[ZJOI2011]营救皮卡丘 最短路-Floyd+有上下界费用流
原文地址:http://www.cnblogs.com/GXZlegend/p/6832504.html 题目描述 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘 ...
- BZOJ2324 [ZJOI2011]营救皮卡丘 【费用流】
题目 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点之间存在M条双向道 ...
- bzoj2324 [ZJOI2011]营救皮卡丘 费用流
[ZJOI2011]营救皮卡丘 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2653 Solved: 1101[Submit][Status][D ...
- 【BZOJ 2324】 [ZJOI2011]营救皮卡丘
Description 皮卡丘被火箭队用邪恶的计谋抢走了!这三个坏家伙还给小智留下了赤果果的挑衅!为了皮卡丘,也为了正义,小智和他的朋友们义不容辞的踏上了营救皮卡丘的道路. 火箭队一共有N个据点,据点 ...
随机推荐
- 历时一周,unity3d+xtion打造我的第一个休闲体感小游戏《空降奇兵》
1.游戏介绍 本游戏属于休闲小游戏,主要操作如下: 菜单控制:举起左手或右手,点击左边或者右边的菜单:挥动左手或右手,选择关卡: 操作方式:玩家跳跃,游戏中的伞兵从飞机开始降落:玩家通过控制伞兵的左右 ...
- Java 集合类(一)
今天我们先讲一下Collection: Collection和Collections的区别: java.util.Collection是一种java集合接口,它提供了对集合对象的基本操作通用接口方法, ...
- [转载]非常完善的Log4net详细说明
前言 此篇文章是我见过写得最好的一片关于Log4Net的文章,内容由简入难,而且面面俱到,堪称入门和精通的佳作,特从懒惰的肥兔的转载过来. 1.概述 log4net是.Net下一个非常优秀的开源日志记 ...
- [原创] zabbix学习之旅四:mail客户端安装
相信大家使用zabbix的最主要目的就是当被监控机器发生故障时,能通过zabbix获得第一时间的报警提醒.zabbix常用的报警媒介有email,短信,jabber和脚本,这其中脚本类型最为灵活,尤其 ...
- c++ 信号量
最近写了个c++项目,发现 ctrl + c 退出程序可以出发析构,但kill pid,则不会触发析构,导致现场数据丢失. 解决方案:同时捕捉以下信号. signal(SIGINT, &完成命 ...
- Eclipse中创建标准web工程以及标准目录结构说明
最近公司有个Web项目,项目结构如下: 虽然运行没有错,但是实在是别扭,标准的web应用一般不采用这种结构: 因此总结一下: 1.如何在Eclipse中创建一个标准的Web应用. 2. ...
- 在客户环境定位.net程序异常
http://www.cnblogs.com/yuilin/p/3788796.html 我们的程序最后都会运行在客户的环境中,客户环境上不会有VS这样的开发工具,那么怎么办呢? 我们可以使用一个很小 ...
- 剑指offer--面试题19
题目:求二叉树镜像 根据作者思路,自己所写代码如下: void BinaryTreeMirror(BinaryTreeNode* pRoot) { if(pRoot == NULL) return; ...
- Fragment (一)
1,简介 Fragement(碎片)允许将Activity拆分成多个完全独立封装的可重用组件,每个组件有它自己的生命周期和UI布局,由此可见,Fragement依赖于Activity,它的生命周期 ...
- hdu 1850 Being a Good Boy in Spring Festival 博弈论
求可行的方案数!! 代码如下: #include<stdio.h> ]; int main(){ int n,m; while(scanf("%d",&n)&a ...