【题目大意】

有一些点,它们之间存在一些有向边(由编号小的到编号大的),从一点到另一点消耗时间为边长。也可以消耗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. Findbugs插件安装与使用

    FindBugs 是由马里兰大学提供的一款开源 Java静态代码分析工具.FindBugs通过检查类文件或 JAR文件,将字节码与一组缺陷模式进行对比从而发现代码缺陷,完成静态代码分析.FindBug ...

  2. Spring: J2EE框架

    Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本.该框架基于 Exper ...

  3. Spring Boot中使用Spring-data-jpa让数据访问更简单、更优雅

    在上一篇Spring中使用JdbcTemplate访问数据库中介绍了一种基本的数据访问方式,结合构建RESTful API和使用Thymeleaf模板引擎渲染Web视图的内容就已经可以完成App服务端 ...

  4. 2017ACM暑期多校联合训练 - Team 4 1003 HDU 6069 Counting Divisors (区间素数筛选+因子数)

    题目链接 Problem Description In mathematics, the function d(n) denotes the number of divisors of positiv ...

  5. 2017ACM暑期多校联合训练 - Team 1 1003 HDU 6035 Colorful Tree (dfs)

    题目链接 Problem Description There is a tree with n nodes, each of which has a type of color represented ...

  6. windows下面安装Python和pip教程

    第一步,先来安装Python.windows下面的Python安装一般是通过软件安装包安装而不是命令行,所以首先要在Python的官方主页上面下载最新的Python安装包.下载地址是:https:// ...

  7. webgote的例子(4)Sql注入(SelectGET)

    SQL Injection (Select/GET) 本章内容 (查询显示中要注意的错误) 这里面我们看一下 movie的数值,选择表单中的当我们选择的二个的时候 move的值也变成了第二个,选择表单 ...

  8. URAL 2078~2089

    URAL 2078~2089 A - Bowling game 题目描述:给出保龄球每一局击倒的球数,按照保龄球的规则,算出总得分的最小值和最大值. solution 首先是最小值:每一局第一球击倒\ ...

  9. SPOJ DQUERY D-query (在线主席树/ 离线树状数组)

    版权声明:本文为博主原创文章,未经博主允许不得转载. SPOJ DQUERY 题意: 给出一串数,询问[L,R]区间中有多少个不同的数 . 解法: 关键是查询到某个右端点时,使其左边出现过的数都记录在 ...

  10. eclipse maven jetty启动修改默认端口

    如何修改eclipse中的maven项目jetty服务器的默认端口那?网上有很多办法,但配置上都没有效果,最后找到了简单.简洁的解决办法,就是在eclipse的jetty启动命令后面加上以下内容 je ...