●BOZJ 1927 [Sdoi2010]星际竞速
题链:
http://www.lydsy.com/JudgeOnline/problem.php?id=1927
题解:
显然是个DAG
建图和有向图最小路径覆盖的建图有些相似。
都是拆点为 u u'分别表示出点和入点。
也都要保证每个点最多有一个出度和一个入度。
但因为带权,要求最小花费,切要满足每个点都去一次,既要满足流量,所以采用最小费用最大流。
S -> u :(1,0) 因为每个点都会到达,所以都可以有一个出度(可以从改点流出一个流量)。
S -> u':(1,a[u]) 传送到达 u点,提供一个入度方式
u -> v':(1,w) u的出度对应 v的入度
u'-> T :(1,0) 流向汇点,表示改点到达过。
代码:
#include<queue>
#include<cstdio>
#include<cstring>
#include<iostream>
#define MAXN 2000
#define MAXM 50000
#define INF 0x3f3f3f3f3f3f3f3f
#define ll long long
using namespace std;
struct Edge{
ll to[MAXM],cap[MAXM],cot[MAXM],nxt[MAXM],head[MAXN],ent;
void Init(){ent=2;}
void Adde(ll u,ll v,ll w,ll c){
to[ent]=v; cap[ent]=w; cot[ent]=c; nxt[ent]=head[u]; head[u]=ent++;
to[ent]=u; cap[ent]=0; cot[ent]=-c;nxt[ent]=head[v]; head[v]=ent++;
}
ll Next(ll i,bool type){
return type?head[i]:nxt[i];
}
}E;
bool vis[MAXN];
ll cur[MAXN],dis[MAXN];
ll N,M,S,T;
ll idx(ll i,ll k){
return i+k*N;
}
bool spfa(){
static bool inq[MAXN];
memset(inq,0,sizeof(inq));
memset(dis,0x3f,sizeof(dis)); ll u,v;
queue<ll> q; dis[T]=0; inq[T]=1; q.push(T);
while(!q.empty()){
u=q.front(); q.pop(); inq[u]=0;
for(ll i=E.Next(u,1);i;i=E.Next(i,0)){
v=E.to[i];
if(!E.cap[i^1]||dis[v]<=dis[u]+E.cot[i^1]) continue;
dis[v]=dis[u]+E.cot[i^1];
if(!inq[v]) q.push(v),inq[v]=1;
}
}
return dis[S]<INF;
}
ll dfs(ll u,ll reflow){
if(u==T||!reflow) return reflow;
ll flowout=0,f,v; vis[u]=1;
for(ll &i=cur[u];i;i=E.Next(i,0)){
v=E.to[i];
if(vis[v]||dis[v]+E.cot[i]!=dis[u]) continue;
f=dfs(v,min(reflow,E.cap[i]));
flowout+=f; E.cap[i^1]+=f;
reflow-=f; E.cap[i]-=f;
if(!reflow) break;
}
if(!flowout) dis[u]=INF;
return flowout;
}
ll Dinic(){
ll cost=0;
while(spfa()){
memcpy(cur,E.head,sizeof(E.head));
memset(vis,0,sizeof(vis));
cost+=dfs(S,INF)*dis[S];
}
return cost;
}
int main()//开long long
{
E.Init();
scanf("%lld%lld",&N,&M);
S=N*2+1; T=N*2+2;
for(ll i=1,w;i<=N;i++){//传送到达 i点。
scanf("%lld",&w);
E.Adde(S,idx(i,1),1,w);
}
for(ll i=1,u,v,w;i<=M;i++){
scanf("%lld%lld%lld",&u,&v,&w);
if(u>v) swap(u,v);
E.Adde(idx(u,0),idx(v,1),1,w);//u的出度对应 v的入度。
}
for(ll i=1;i<=N;i++){
E.Adde(S,idx(i,0),1,0);//因为每个点都会到达,所以都可以提供一个出度。
E.Adde(idx(i,1),T,1,0);//流向汇点,表示改点到达。
}
ll cost=Dinic();
printf("%lld",cost);
return 0;
}
●BOZJ 1927 [Sdoi2010]星际竞速的更多相关文章
- BZOJ 1927: [Sdoi2010]星际竞速
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2051 Solved: 1263[Submit][Stat ...
- 1927: [Sdoi2010]星际竞速
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 2040 Solved: 1257[Submit][Stat ...
- 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到点连边边权为曲速的代价,一个曲速移 ...
- Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)
Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流) Description 10年一度的银河系赛车大赛又要开始了.作为全 ...
- 【bzoj】1927 [Sdoi2010]星际竞速
[算法]最小费用最大流 [题解]跟滑雪略有类似,同样因为可以重复所以不是最小路径覆盖. 连向汇的边容量为1足矣,因为一个点只会出去一次(路径结束). bzoj 1927 [Sdoi2010]星际竞速 ...
- Bzoj 1927: [Sdoi2010]星际竞速(网络流)
1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Description 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大 ...
随机推荐
- 每日冲刺报告——Day3(Java-Team)
第三天报告(11.4 周六) 团队:Java-Team 成员: 章辉宇(284) 吴政楠(286) 陈阳(PM:288) 韩华颂(142) 胡志权(143) github地址:https://git ...
- C语言——第六周作业
题目 题目一:高速公路超速处罚 1.实验代码 #include <stdio.h> int main() { int speed,maxspeed; double x; scanf(&qu ...
- 【iOS】OC-UTC日期字符串格式化
NSLog(@"%@",[NSDate date]); NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init ...
- C++中文件的读写
C++中文件的读写 在C++中如何实现文件的读写? 一.ASCII 输出 为了使用下面的方法, 你必须包含头文件<fstream.h>(译者注:在标准C++中,已经使用<fstrea ...
- NOIP2012 提高组 Day 2
http://www.cogs.pro/cogs/page/page.php?aid=16 期望得分:100+100+0=0 实际得分:100+20+0=120 T2线段树标记下传出错 T1 同余方程 ...
- EasyUI 中datagrid 分页。
注释:datagrid分页搞了好几天才完全搞好,网上没完全的资料.明天晚上贴代码. 睡觉.
- Lock(三)查看是谁把表给锁了
查看是谁把表给锁了 select se1.inst_id as 被阻塞的会话节点, se2.inst_id as 罪魁祸首节点, se1.sid as 被阻塞的会话ID, ob.object_name ...
- Python内置函数(54)——callable
英文文档: callable(object) Return True if the object argument appears callable, False if not. If this re ...
- redis入门(03)redis的配置
一.配置文件 Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf.你可以通过 CONFIG 命令查看或设置配置项. 二.查看修改 1.查看配置 1.1.vi redis ...
- 英语词汇(5)followed by / sung by / written by
Sung by 演唱者; [例句]In the recording I have today, it is sung by a male alto.我今天带的唱片是由一位男高音歌手唱的. follow ...