BZOJ 1927 星际竞速(费用流)
考虑费用流,题目要求走n个点都走完且恰好一次,显然流量的限制为n。
建立源点s和汇点t,并把每个星球拆成两个点i和i',分别表示已到达该点和经过该点。
对于能力爆发,建边(s,i',1,w). 对应高速航行,建边(s,i,1,0), (i,j',1,w).
因为每个点必须走一次且只能走一次。建边(i',t,1,0).
其实就是类似最小路径覆盖的建图方法。
# include <cstdio>
# include <cstring>
# include <cstdlib>
# include <iostream>
# include <vector>
# include <queue>
# include <stack>
# include <map>
# include <set>
# include <cmath>
# include <algorithm>
using namespace std;
# define lowbit(x) ((x)&(-x))
# define pi 3.1415926535
# define eps 1e-
# define MOD
# define INF
# define mem(a,b) memset(a,b,sizeof(a))
# define FOR(i,a,n) for(int i=a; i<=n; ++i)
# define FO(i,a,n) for(int i=a; i<n; ++i)
# define bug puts("H");
# define lch p<<,l,mid
# define rch p<<|,mid+,r
# define mp make_pair
# define pb push_back
typedef pair<int,int> PII;
typedef vector<int> VI;
# pragma comment(linker, "/STACK:1024000000,1024000000")
typedef long long LL;
int Scan() {
int res=, flag=;
char ch;
if((ch=getchar())=='-') flag=;
else if(ch>=''&&ch<='') res=ch-'';
while((ch=getchar())>=''&&ch<='') res=res*+(ch-'');
return flag?-res:res;
}
void Out(int a) {
if(a<) {putchar('-'); a=-a;}
if(a>=) Out(a/);
putchar(a%+'');
}
const int N=;
//Code begin... struct Edge{
int to, next, cap, flow, cost;
Edge(int _to=, int _next=, int _cap=, int _flow=, int _cost=):
to(_to), next(_next), cap(_cap), flow(_flow), cost(_cost){}
}edge[];
struct ZKW_MinCostMaxFlow{
int head[N], tot, cur[N], dis[N], ss, tt, n, min_cost, max_flow;
bool vis[N];
void init(){tot=; mem(head,-);}
void addedge(int u, int v, int cap, int cost){
edge[tot]=Edge(v,head[u],cap,,cost);
head[u]=tot++;
edge[tot]=Edge(u,head[v],,,-cost);
head[v]=tot++;
}
int aug(int u, int flow){
if (u==tt) return flow;
vis[u]=true;
for (int i=cur[u]; i!=-; i=edge[i].next) {
int v=edge[i].to;
if (edge[i].cap>edge[i].flow&&!vis[v]&&dis[u]==dis[v]+edge[i].cost) {
int tmp=aug(v,min(flow,edge[i].cap-edge[i].flow));
edge[i].flow+=tmp; edge[i^].flow-=tmp; cur[u]=i;
if (tmp) return tmp;
}
}
return ;
}
bool modify_label(){
int d=INF;
FO(u,,n) if (vis[u]) for (int i=head[u]; i!=-; i=edge[i].next) {
int v=edge[i].to;
if (edge[i].cap>edge[i].flow&&!vis[v]) d=min(d,dis[v]+edge[i].cost-dis[u]);
}
if (d==INF) return false;
FO(i,,n) if (vis[i]) vis[i]=false, dis[i]+=d;
return true;
}
PII mincostmaxflow(int start, int end, int nn){
ss=start, tt=end, n=nn; min_cost=max_flow=;
FO(i,,n) dis[i]=;
while () {
FO(i,,n) cur[i]=head[i];
while () {
FO(i,,n) vis[i]=false;
int tmp=aug(ss,INF);
if (tmp==) break;
max_flow+=tmp; min_cost+=tmp*dis[ss];
}
if (!modify_label()) break;
}
return mp(min_cost,max_flow);
}
}solve;
int main ()
{
int n, m, s, t, x, u, v;
scanf("%d%d",&n,&m);
s=; t=*n+;
solve.init();
FOR(i,,n) scanf("%d",&x), solve.addedge(s,i,,), solve.addedge(s,n+i,,x), solve.addedge(n+i,t,,);
FOR(i,,m) {
scanf("%d%d%d",&u,&v,&x);
if (u>v) swap(u,v);
solve.addedge(u,n+v,,x);
}
printf("%d\n",solve.mincostmaxflow(s,t,t+).first);
return ;
}
BZOJ 1927 星际竞速(费用流)的更多相关文章
- BZOJ 1927: [Sdoi2010]星际竞速 费用流
1927: [Sdoi2010]星际竞速 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- BZOJ 1927: [Sdoi2010]星际竞速(费用流)
传送门 解题思路 仿照最小路径覆盖问题,用费用流解决此题.最小路径覆盖问题是拆点连边后用\(n-\)最大匹配,这里的话也是将每个点拆点,源点向入点连流量为\(1\),费用为\(0\)的边,向出点连流量 ...
- Luogu2469 SDOI2010 星际竞速 费用流
传送门 发现它的本质是求一个费用最小的路径覆盖 最小路径覆盖是网络流23题中的一个比较典型的模型 所以考虑相似的建边 因为每一个点要恰好经过一次,是一个有上下界的网络流,故拆点,星球\(i\)拆成\( ...
- BZOJ 1927 星际竞速(最小费用最大流)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1927 题意:一个图,n个点.对于给出的每条边 u,v,w,表示u和v中编号小的那个到编号 ...
- bzoj 1927 星际竞速 —— 最小费用最大流
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1927 首先注意到这是个DAG: 考虑每个点从哪里来,可以是瞬移来的,也可以是从某个点走过来的 ...
- BZOJ 1927 星际竞速
http://www.lydsy.com/JudgeOnline/problem.php?id=1927 思路:把一个点拆成两个点, S->i 费用0,流量1 (代表这个点可以移动到其他点所必备 ...
- [SDOI2010]星际竞速——费用流
类似于最短路的网络流,而且还要保证每个点经过一次,拆点就比较方便了. 连边怎么连?要保证最大流是n(每个点经过一次)还要能从直接跳转 将每个点拆点.源点向每个点的入点连一条容量为1费用为0的边.源点向 ...
- [bzoj 1449] 球队收益(费用流)
[bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...
- BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)
BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...
随机推荐
- 笔记-django-视图
笔记-django-视图 1. dispatch 1.1. overview To design URLs for an app, you create a Python module ...
- Luogu P3120 [USACO15FEB]牛跳房子(金)Cow Hopscotch (Gold)
题目传送门 这是一道典型的记忆化搜索题. f[x][y]表示以x,y为右下角的方案数. code: #include <cstdio> #define mod 1000000007 usi ...
- 人脸检测库libfacedetection介绍
libfacedetection是于仕琪老师放到GitHub上的二进制库,没有源码,它的License是MIT,可以商用.目前只提供了windows 32和64位的release动态库,主页为http ...
- nio之netty3的应用
1.netty3是nio的封装版本.在使用上面比nio的直接使用更好.nio简单使用都是单线程的方式(比如:一个服务员服务很多客户),但是netty3的方式不一样的是,引入线程池的方式来实现服务的通信 ...
- 图片文件转换成Base64编码实现ajax提交图片
//上传头像图片 function uploadHead(imgPath) { console.log("imgPath = " + imgPath); var image = n ...
- WPF Style Setter use a TemplateBinding?
<Style TargetType="{x:Type local:ImageButton}"> <Setter Property="Horizontal ...
- tpo-10 C1 How to get photographs exhibited
第 1 段 1.Listen to a conversation between a student and her Photography professor. 听一段学生和摄影学教授的对话. 第 ...
- python简单循环生成器
import time #循环生成器 def traversal_list(alist, i): while True: length = len(alist) i = i%(length) yiel ...
- Python高级编程-多进程
要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊.普通的函数调用,调用一次,返回 ...
- POJ 3487 The Stable Marriage Problem(稳定婚姻问题 模版题)
Description The stable marriage problem consists of matching members of two different sets according ...