【费用流】BZOJ1927-[Sdoi2010]星际竞速
【题目大意】
有一些点,它们之间存在一些有向边(由编号小的到编号大的),从一点到另一点消耗时间为边长。也可以消耗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]星际竞速的更多相关文章
- BZOJ1927 [Sdoi2010]星际竞速 【费用流】
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Submit: 2582 Solved: 1601 [Submit][St ...
- bzoj1927: [Sdoi2010]星际竞速
跟上一题几乎一样... #include<cstdio> #include<cstring> #include<iostream> #include<algo ...
- BZOJ1927: [Sdoi2010]星际竞速(最小费用最大流 最小路径覆盖)
题意 题目链接 Sol 看完题不难想到最小路径覆盖,但是带权的咋做啊?qwqqq 首先冷静思考一下:最小路径覆盖 = \(n - \text{二分图最大匹配数}\) 为什么呢?首先最坏情况下是用\(n ...
- BZOJ 1927: [Sdoi2010]星际竞速 费用流
1927: [Sdoi2010]星际竞速 Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/pr ...
- bzoj 1927 [Sdoi2010]星际竞速(最小费用最大流)
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1576 Solved: 954[Submit][Statu ...
- BZOJ 1927: [Sdoi2010]星际竞速(最小费用最大流)
拆点,费用流... ----------------------------------------------------------------------------- #include< ...
- BZOJ 1927: [Sdoi2010]星际竞速 [上下界费用流]
1927: [Sdoi2010]星际竞速 题意:一个带权DAG,每个点恰好经过一次,每个点有曲速移动到他的代价,求最小花费 不动脑子直接上上下界费用流过了... s到点连边边权为曲速的代价,一个曲速移 ...
- P2469 [SDOI2010]星际竞速(费用流)
P2469 [SDOI2010]星际竞速 最小路径覆盖问题 每个星球必须恰好去一次,而每次高速航行都是从一个星球到另一个星球. 那么高速航行的起点可以保证被去过 高速航行和空间跳跃可以是互相独立的 将 ...
- BZOJ 1927: [Sdoi2010]星际竞速
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2051 Solved: 1263[Submit][Stat ...
随机推荐
- XML & JSON---iOS-Apple苹果官方文档翻译
技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong //转载请注明出处--本文永久链接 ...
- python mysql参数化查询防sql注入
一.写法 cursor.execute('insert into user (name,password) value (?,?)',(name,password)) 或者 cursor.execut ...
- HTTP、HTTPS
http是一种无状态协议,通过短暂保持浏览器核服务器间通信可以有效减少为保持连接而耗费的额外开销.无状态意味着浏览器和服务器完成一次通信后,连接会释放.在下一次会话发起时,浏览器核服务器端不会记录上一 ...
- c语言学习笔记.指针.
指针: 一个变量,其值为另一个变量的地址,即,内存位置的直接地址. 声明: int *ptr; /* 一个整型的指针,指针指向的类型是整型 */ double *ptr; /* 一个 double 型 ...
- docker 镜像导入和导出
使用 docker commit 即可把这个容器变为一个镜像 docker commit 8d93082a9ce1 ubuntu:myubuntu 这时候 docker 容器会被创建为一个新的 Ubu ...
- 【Python学习】request库
Requests库(https://www.python-requests.org/)是一个擅长处理那些复杂的HTTP请求.cookie.header(响应头和请求头)等内容的Python第三方库. ...
- FPGA编码规则检查表
FPGA编码规则检查表 -----------------------摘自<FPGA软件测试与评价技术> 中国电子信息产业发展研究院 | 编著 1.一个单独的文件应该只包含一个单独的mod ...
- Codeforces Round #502
Codeforces Round #502 C. The Phone Number 题目描述:求一个\(n\)排列,满足\(LIS+LDS\)最小 solution 枚举\(LIS\),可证明\(LD ...
- DAG blockchain (byteball)
转载参考自: https://www.jinse.com/bitcoin/116184.html https://www.jinse.com/blockchain/116175.html https: ...
- 读书笔记 effective c++ Item 3 在任何可能的时候使用 const
Const可以修饰什么? Const 关键字是万能的,在类外部,你可以用它修饰全局的或者命名空间范围内的常量,也可以用它来修饰文件,函数和块作用域的静态常量.在类内部,你可以使用它来声明静态或者非 ...