题链:

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. 1013团队Beta冲刺day4

    项目进展 李明皇 今天解决的进度 因服务器端未完成登录态维护,故无法进行前后端联动. 明天安排 前后端联动调试 林翔 今天解决的进度 因上课和实验室事务未完成登录态维护 明天安排 完成登录态维护 孙敏 ...

  2. scrapy crawl rules设置

    rules = [ Rule(SgmlLinkExtractor(allow=('/u012150179/article/details'), restrict_xpaths=('//li[@clas ...

  3. IQKeyboardManager使用方法

    使用方法: 将IQKeyboardManager 和 IQSegmentedNextPrevious类文件加进项目中.在AppDelegate文件中写下以下一行代码: [IQKeyBoardManag ...

  4. python使用tesseract-ocr完成验证码识别(安装部分)

    一.tesseract-ocr安装 Ubuntu版本: 1.tesseract-ocr安装 sudo apt-get install tesseract-ocr 2.pytesseract安装 sud ...

  5. Mybatis和Hibernate本质区别和应用场景

    Hibernate:是一个标准ORM(对象关系映射)框架.入门门槛较高,不需要程序员写sql语句,sql语句自动生成,对sql语句优化.修改比较困难 应用场景:适用于需求变化不多的中小型项目,比如后台 ...

  6. Spring Security 入门(3-11)Spring Security 的使用-自定义登录验证和回调地址

    配置文件 security-ns.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmln ...

  7. MYSQL之库操作

    一.系统数据库 information_schema :虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等 mysql:核心数据库,里面包含用户.权限. ...

  8. python开发:初识python

    python简介 Python可以应用于众多领域,如:数据分析.组件集成.网络服务.图像处理.数值计算和科学计算等众多领域.目前业内几乎所有大中型互联网企业都在使用Python,如:Youtube.D ...

  9. .net core 使用阿里云短信发送SMS

    阿里云官方的skd(aliyun-net-sdk-core,aliyun-net-sdk-dysmsapi)在dnc中发送短信会出错,nuget上的包貌似也一样不管用.直接改下sdk当然也可以,但就发 ...

  10. z-index的权重是叠加的

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...