【题目大意】

有一些点,它们之间存在一些有向边(由编号小的到编号大的),从一点到另一点消耗时间为边长。也可以消耗Ti时间直接抵达任意一个点。问所有点都走一遍最少需要多少时间?

【思路】

①将每个点i拆为i和i’。

②由S向i连(cap=1,cost=0)的边。由i'向T连(1,0)的边,表示抵达过该点。

③由S向i'连(1,Ti)的边,表示直接从某点跳转到i点。

④根据有向边[i,j]连(i,j')的边。

为什么这样是正确的?由于我们只关心每个点都被抵达过而不关心路径。费用流的前提是最大流,我们一定可以保证所有点都被经过,那么就可以通过③④区分是用跳转抵达还是通过有向边抵达了。

*好久不写费用流,华丽写挂一发。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#define S 0
#define T 2*n+1
using namespace std;
const int INF=0x7fffffff;
const int MAXN=(+)*+;
struct node
{
int to,pos,cap,cost;
};
int n,m;
vector<node> E[MAXN];
int pre[MAXN],preedge[MAXN]; void addedge(int u,int v,int w,int cos)
{
E[u].push_back((node){v,E[v].size(),w,cos});
E[v].push_back((node){u,E[u].size()-,,-cos});
} void init()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
int ai;
scanf("%d",&ai);
addedge(S,i+n,,ai);
addedge(S,i,,);
addedge(i+n,T,,);
}
for (int i=;i<m;i++)
{
int ui,vi,wi;
scanf("%d%d%d",&ui,&vi,&wi);
if (ui>vi) swap(ui,vi);
addedge(ui,vi+n,,wi);
}
} int spfa()
{
queue<int> que;
int vis[MAXN],in[MAXN],dis[MAXN];
memset(in,,sizeof(in));
memset(pre,-,sizeof(pre));
for (int i=S;i<=T;i++) dis[i]=INF;
que.push(S);
vis[S]=;
dis[S]=;
while (!que.empty())
{
int head=que.front();que.pop();
vis[head]=;
for (int i=;i<E[head].size();i++)
{
node &tmp=E[head][i];
if (tmp.cap> && dis[tmp.to]>dis[head]+tmp.cost)
{
dis[tmp.to]=dis[head]+tmp.cost;
pre[tmp.to]=head;
preedge[tmp.to]=i;
if (!in[tmp.to])
{
que.push(tmp.to);
in[tmp.to]=;
}
}
}
}
if (dis[T]==INF) return ;else return ;
//和dinic不同,不能再tmp.to==T时直接返回,因为要找到最短路
} void mcf()
{
int ans=;
while (spfa())
{
int flow=INF;
for (int i=T;pre[i]!=-;i=pre[i])
{
flow=min(flow,E[pre[i]][preedge[i]].cap);
}
for (int i=T;pre[i]!=-;i=pre[i])
{
node& tmp=E[pre[i]][preedge[i]];
tmp.cap-=flow;
E[tmp.to][tmp.pos].cap+=flow;
ans+=flow*tmp.cost;
}
}
printf("%d",ans);
} int main()
{
init();
mcf();
}

【费用流】BZOJ1927-[Sdoi2010]星际竞速的更多相关文章

  1. BZOJ1927 [Sdoi2010]星际竞速 【费用流】

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MB Submit: 2582  Solved: 1601 [Submit][St ...

  2. bzoj1927: [Sdoi2010]星际竞速

    跟上一题几乎一样... #include<cstdio> #include<cstring> #include<iostream> #include<algo ...

  3. BZOJ1927: [Sdoi2010]星际竞速(最小费用最大流 最小路径覆盖)

    题意 题目链接 Sol 看完题不难想到最小路径覆盖,但是带权的咋做啊?qwqqq 首先冷静思考一下:最小路径覆盖 = \(n - \text{二分图最大匹配数}\) 为什么呢?首先最坏情况下是用\(n ...

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

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

  5. bzoj 1927 [Sdoi2010]星际竞速(最小费用最大流)

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 1576  Solved: 954[Submit][Statu ...

  6. BZOJ 1927: [Sdoi2010]星际竞速(最小费用最大流)

    拆点,费用流... ----------------------------------------------------------------------------- #include< ...

  7. BZOJ 1927: [Sdoi2010]星际竞速 [上下界费用流]

    1927: [Sdoi2010]星际竞速 题意:一个带权DAG,每个点恰好经过一次,每个点有曲速移动到他的代价,求最小花费 不动脑子直接上上下界费用流过了... s到点连边边权为曲速的代价,一个曲速移 ...

  8. P2469 [SDOI2010]星际竞速(费用流)

    P2469 [SDOI2010]星际竞速 最小路径覆盖问题 每个星球必须恰好去一次,而每次高速航行都是从一个星球到另一个星球. 那么高速航行的起点可以保证被去过 高速航行和空间跳跃可以是互相独立的 将 ...

  9. BZOJ 1927: [Sdoi2010]星际竞速

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 2051  Solved: 1263[Submit][Stat ...

随机推荐

  1. a 标签传值

    转载:http://blog.csdn.net/muyeju/article/details/48594377 .<a>标签传值的形式--参数固定:<a href="地址? ...

  2. final关键字详解

    java中,final关键字可以用来修饰类.方法和变量(包括成员变量和局部变量).下面就从这三个方面来了解一下final关键字的基本用法. 1.修饰类 当用final修饰一个类时,表明这个类不能被继承 ...

  3. USB基础介绍

    (转)USB (Universal Serial Bus) 全文地址:http://vlewang.blog.163.com/blog/static/105878151201032804347546/ ...

  4. 64_p1

    PEGTL-devel-1.3.1-2.fc26.i686.rpm 13-Feb-2017 22:10 64086 PEGTL-devel-1.3.1-2.fc26.x86_64.rpm 13-Feb ...

  5. HttpURLConnection传json

    private static String sendToWangTing(DataRow dataRow) throws IOException{ String ip = Configuration. ...

  6. 017 CPU冲高定位方法

    1.通过top命令查看cpu占用高的进程ID; 2.通过top -Hp 进程ID 查看该进程下所有线程占用cpu的情况,拿出占用cpu最高的线程ID,换算成十六进制; 3.通过 jstack 进程ID ...

  7. 【BubbleCup X】G:Bathroom terminal

    一个hash的题 对?出现位置直接暴力枚举,然后hash判断下,扔进map里 cf的评测机跑的针tm块 #include<bits/stdc++.h> ; ; typedef long l ...

  8. 移动端touch滑屏事件

    <script> var windowHeight = $(window).height(), $body = $("body");// console.log($(w ...

  9. int各种数据类型的表示范围

    计算方法:1.正数部分数部分:2^(字节数*8-1)-1 2.负数部分:-(2^(字节数*8-1)+1) unsign int:正数部分*2+1

  10. [Ext JS 4]后台自动产生图档

    前言 [Ext JS 4] 实战之将chart导出为png, jpg 格式的文件 承接上一篇, 我们可以做到在Browser端打开一个Chart,并导出为png或是jpg 等格式的图档. 但实际的需求 ...