考虑费用流,题目要求走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 星际竞速(费用流)的更多相关文章

  1. BZOJ 1927: [Sdoi2010]星际竞速 费用流

    1927: [Sdoi2010]星际竞速 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...

  2. BZOJ 1927: [Sdoi2010]星际竞速(费用流)

    传送门 解题思路 仿照最小路径覆盖问题,用费用流解决此题.最小路径覆盖问题是拆点连边后用\(n-\)最大匹配,这里的话也是将每个点拆点,源点向入点连流量为\(1\),费用为\(0\)的边,向出点连流量 ...

  3. Luogu2469 SDOI2010 星际竞速 费用流

    传送门 发现它的本质是求一个费用最小的路径覆盖 最小路径覆盖是网络流23题中的一个比较典型的模型 所以考虑相似的建边 因为每一个点要恰好经过一次,是一个有上下界的网络流,故拆点,星球\(i\)拆成\( ...

  4. BZOJ 1927 星际竞速(最小费用最大流)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1927 题意:一个图,n个点.对于给出的每条边 u,v,w,表示u和v中编号小的那个到编号 ...

  5. bzoj 1927 星际竞速 —— 最小费用最大流

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1927 首先注意到这是个DAG: 考虑每个点从哪里来,可以是瞬移来的,也可以是从某个点走过来的 ...

  6. BZOJ 1927 星际竞速

    http://www.lydsy.com/JudgeOnline/problem.php?id=1927 思路:把一个点拆成两个点, S->i 费用0,流量1 (代表这个点可以移动到其他点所必备 ...

  7. [SDOI2010]星际竞速——费用流

    类似于最短路的网络流,而且还要保证每个点经过一次,拆点就比较方便了. 连边怎么连?要保证最大流是n(每个点经过一次)还要能从直接跳转 将每个点拆点.源点向每个点的入点连一条容量为1费用为0的边.源点向 ...

  8. [bzoj 1449] 球队收益(费用流)

    [bzoj 1449] 球队收益(费用流) Description Input Output 一个整数表示联盟里所有球队收益之和的最小值. Sample Input 3 3 1 0 2 1 1 1 1 ...

  9. BZOJ.2597.[WC2007]剪刀石头布(费用流zkw)

    BZOJ 洛谷 \(Description\) 给定一张部分边方向已确定的竞赛图.你需要给剩下的边确定方向,使得图中的三元环数量最多. \(n\leq100\). \(Solution\) 这种选择之 ...

随机推荐

  1. Zookeeper原理和实战开发经典视频教程 百度云网盘下载

    Zookeeper原理和实战开发 经典视频教程 百度云网盘下载 资源下载地址:http://pan.baidu.com/s/1o7ZjPeM   密码:r5yf   

  2. hdu 2187(凸包直径 1.枚举 2.旋转卡壳)

    Beauty Contest Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 33115   Accepted: 10278 ...

  3. jquery实现倒计时功能

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Spring Boot 2.x Redis多数据源配置(jedis,lettuce)

    Spring Boot 2.x Redis多数据源配置(jedis,lettuce) 96 不敢预言的预言家 0.1 2018.11.13 14:22* 字数 65 阅读 727评论 0喜欢 2 多数 ...

  5. solr 常见的问题整理 -费元星

    本文是我在开发过程中遇到的一些问题的整理,有些摘自网上别人的方法. 1. org.apache.solr.client.solrj.SolrServerException: Timeout occur ...

  6. 利用Powershell查询AD中账号属性

    标签:AD账号信息 最后登录时间 最后修改密码.SID 账号SID 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://hubuxcg ...

  7. 使用materialization

    explain select `countries`.`id` AS `id`,`countries`.`sortname` AS `sortname`,`countries`.`name` AS ` ...

  8. react组件性能

    一.渲染原理 二.性能优化 三.Immutable在性能优化中的作用

  9. c和c++的强制类型转换

    我们知道c语言中的类型转换只有一种, TYPE b = (TYPE)a; 而在c++中按照不同作用的转换类型将其细分为三个显示类型转换符号static_cast, const_cast, reinte ...

  10. hdu2037今年暑假不AC(贪心,活动安排问题)

    今年暑假不AC Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submi ...