BZOJ 2055 80人环游世界 有上下界的费用流

题目大意:给定n个点,每个点有固定的经过次数,m个人从任意节点出发任意节点结束,只能向右走,要求总边权和最小

有源汇、有上下界的费用流

其实上下界费用流有两种写法- - 一种是按照上下界网络流那么转化- - 一种是把必经边的费用减掉一个INF 跑完再加回去

我比较倾向于第一种写法- - 第二种写法在INF的取值上有点麻烦- -

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 220
#define S 210
#define T 211
#define _S 212
#define _T 213
#define INF 0x3f3f3f3f
using namespace std;
struct abcd{
	int to,flow,cost,next;
}table[1001001];
int head[M],tot=1;
int n,m,ans;
void Add(int x,int y,int f,int c)
{
	table[++tot].to=y;
	table[tot].flow=f;
	table[tot].cost=c;
	table[tot].next=head[x];
	head[x]=tot;
}
void Link(int x,int y,int f,int c)
{
	Add(x,y,f,c);
	Add(y,x,0,-c);
}
bool Edmonds_Karp()
{
	static int q[65540],flow[M],cost[M],from[M];
	static unsigned short r,h;
	static bool v[M];
	int i;
	memset(cost,0x3f,sizeof cost);
	flow[S]=INF;cost[S]=0;q[++r]=S;
	while(r!=h)
	{
		int x=q[++h];v[x]=0;
		for(i=head[x];i;i=table[i].next)
			if(table[i].flow&&cost[table[i].to]>cost[x]+table[i].cost)
			{
				cost[table[i].to]=cost[x]+table[i].cost;
				flow[table[i].to]=min(flow[x],table[i].flow);
				from[table[i].to]=i;
				if(!v[table[i].to])
					v[table[i].to]=true,q[++r]=table[i].to;

			}
	}
	if(cost[T]==INF) return false;
	ans+=flow[T]*cost[T];
	for(i=from[T];i;i=from[table[i^1].to])
		table[i].flow-=flow[T],table[i^1].flow+=flow[T];
	return true;
}
int main()
{
	int i,j,x;
	cin>>n>>m;
	Link(_T,_S,m,0);
	for(i=1;i<=n;i++)
	{
		scanf("%d",&x);
		Link(S,i<<1,x,0);
		Link(i+i-1,T,x,0);
		Link(_S,i+i-1,INF,0);
		Link(i<<1,_T,INF,0);
	}
	for(i=1;i<=n;i++)
		for(j=i+1;j<=n;j++)
		{
			scanf("%d",&x);
			if(~x) Link(i<<1,j+j-1,INF,x);
		}

	while( Edmonds_Karp() );
	cout<<ans<<endl;
	return 0;
}
时间: 2025-01-07 14:42:04

BZOJ 2055 80人环游世界 有上下界的费用流的相关文章

bzoj 2055: 80人环游世界 -- 上下界网络流

2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MB Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个80人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家. 因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第i个人的游历路线为P1.P2......Pk(0≤k≤N),则P1<P2&

bzoj 2055 80人环游世界

有源汇上下界最小费用可行流. 将每个国家拆点. 源点向一个新建节点连一条上界为总人数下界为0费用为0的边. 新建节点向每个国家的入点连一条上界为正无穷下界为0费用为0的边. 每个国家的入点向出点连一条上下界均为该国家访问人数费用为0的边. 每个国家的出点向汇点连一条上界为正无穷下界为0费用为0的边. 对于国家i能到国家j,i的出点向j的入点连一条上界为正无穷下界为0费用为机票费的边. 然后对图求一边有源汇上下界最小费用可行流即可得出最小费用. 具体做法是先将所有边的下界乘费用相加,这一部分是必须

【bzoj2055】80人环游世界 有上下界费用流

原文地址:http://www.cnblogs.com/GXZlegend 题目描述 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个80人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家. 因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为1...N.假若第i个人的游历路线为P1.P2......Pk(0≤k≤N),则P1<P2<......<Pk. 众所周知,中

bzoj千题计划159:bzoj2055: 80人环游世界(上下界费用流)

http://www.lydsy.com/JudgeOnline/problem.php?id=2055 某个国家必须经过vi次, 可以转化为上下界都为vi的边 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define N 205 #define M 10500 const int inf=1e9; int sr

【BZOJ-2055】80人环游世界 上下界费用流 (无源无汇最小费用最大流)

2055: 80人环游世界 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 321  Solved: 201[Submit][Status][Discuss] Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个80人的团伙,也想来一次环游世界. 他们打算兵分多路,游遍每一个国家. 因为他们主要分布在东方,所以他们只朝西方进军.设从东方到西方的每一个国家的编号依次为

P4553 80人环游世界 上下界费用流

题意: 有1-n个城市  有m个人去旅游  每个人只能从编号小的城市到编号大的城市  花费费用为COSTij   一开始每个人可以从任意一个城市开始旅行   且每个城市恰好有Vi个人经过(一开始也算经过) 问最小花费 显然用有上下界的费用流非常好理解  每个点进行拆点 两点之间连上界和下界都为Vi 表示正好通过Vi人      然后经典连图即可 再控制一下人数m  跑模板 (正面建图) #include<bits/stdc++.h> using namespace std; //input b

【UVALive - 5131】Chips Challenge(上下界循环费用流)

Description A prominent microprocessor company has enlisted your help to lay out some interchangeable components(widgets) on some of their computer chips. Each chip’s design is an N × N square of slots. Oneslot can hold a single component, and you ar

BZOJ2055 80人环游世界

m个人随便设定起点= =,所以是有上下界网络流喽... 今天刚学,于是试着写了写,1A耶! 费用流是板子哦~ 1 /************************************************************** 2 Problem: 2055 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:536 ms 7 Memory:8624 kb 8 ******************************

[bzoj2055]80人环游世界[网络流,上下界网络流]

手动画了整张图,,算是搞懂了吧,, 1 #include <bits/stdc++.h> 2 3 #define INF 0x3f3f3f3f 4 5 using namespace std; 6 7 template<const int _n,const int _m> 8 struct Edge 9 { 10 struct Edge_base { int to,next,w,c; }e[_m]; int cnt,p[_n]; 11 Edge() { clear(); } 12