题链:

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]星际竞速的更多相关文章

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

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

  2. 1927: [Sdoi2010]星际竞速

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

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

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

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

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

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

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

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

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

  7. Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流)

    Luogu 2469 [SDOI2010]星际竞速 / HYSBZ 1927 [Sdoi2010]星际竞速 (网络流,最小费用流) Description 10年一度的银河系赛车大赛又要开始了.作为全 ...

  8. 【bzoj】1927 [Sdoi2010]星际竞速

    [算法]最小费用最大流 [题解]跟滑雪略有类似,同样因为可以重复所以不是最小路径覆盖. 连向汇的边容量为1足矣,因为一个点只会出去一次(路径结束). bzoj 1927 [Sdoi2010]星际竞速 ...

  9. Bzoj 1927: [Sdoi2010]星际竞速(网络流)

    1927: [Sdoi2010]星际竞速 Time Limit: 20 Sec Memory Limit: 259 MB Description 10年一度的银河系赛车大赛又要开始了.作为全银河最盛大 ...

随机推荐

  1. 从0开始的LeetCode生活—9. Palindrome Number(回文数)

    题目大意: 判断输入的数字是不是回文数.所谓回文数就是正反读都一样的数字,比如说11,121,1221这样子的数字.负数不会是回文数. 解题思路: 思路一:如果这个数是负数,则返回false,否则用一 ...

  2. Beta冲刺NO.1

    Beta冲刺 第一天 1. 昨天的困难 由于今天还是第一天,所以暂时没有昨天的困难. 2. 今天解决的进度 潘伟靖: 对代码进行了review 1.将某些硬编码改为软编码 2.合并了一些方法,简化代码 ...

  3. 百词斩APP分析

    一.调研 1.第一次上手   第一次使用,可以使用微信和qq登录感觉挺不错的不然又要注册有点麻烦,在功能上,用户可以针对自身选择不同水平的英语背单词,然后有多钟方式对自己的听力和单词翻译进行提升.在u ...

  4. 冲刺NO.5

    Alpha冲刺第五天 站立式会议 项目进展 今日项目完成内容主要包括了JS的学习,事务管理员模块与学生模块的完善与补充,并且开始编写信用信息管理模块和奖惩事务管理模块. 问题困难 前端部分的技术掌握的 ...

  5. Flask 扩展 Mail

    安装 pip install flask-mail from flask import Flask from flask_mail import Mail, Message app = Flask(_ ...

  6. markdown最基本的几种语法

    1.标题 # 相当于<h1></h1> ## 相当于<h2></h2> ### 相当于<h3></h3> #### 相当于< ...

  7. WIN7 局域网共享打印机每次电脑重启后必须登录密码重新连接问题修复

    第一步,WIN+R(或者开始->附件->运行)输入gpedit或gpedit.msc 进入 第二步:把这几个拒绝的Guest给删除掉,也可以只删除""拒绝从王洛访问这台 ...

  8. Python内置函数(4)——min

    英文文档: min(iterable, *[, key, default]) min(arg1, arg2, *args[, key]) Return the smallest item in an ...

  9. SpringCloud的配置管理:Spring Cloud Config

    演示如何使用ConfigServer提供统一的参数配置服务 ###################################################################一.概 ...

  10. React中路由传参及接收参数的方式

    注意:  路由表改变后要重启服务      方式 一:          通过params         1.路由表中                     <Route path=' /s ...