热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Ahoi2014Jsoi2014支线剧情

题目描述题解:每条边至少经过一次,说明经过下界为$1$。然后套有源汇上下界最小费用可行流板子。口胡一下。此类问题的建图通式为:1.假设原来

题目描述

题解:

每条边至少经过一次,说明经过下界为$1$。

然后套有源汇上下界最小费用可行流板子。

口胡一下。

此类问题的建图通式为:

1.假设原来的边流量上下界为$[l,r]$,那么在新图中建流量上界为$(r-l)$的边;

就是必须流的先流完,不一定的一会再算。

2.统计一下每个点流入的$l$之和$ind$以及流出的$l$之和$otd$,设$d=ind-otd$;

若$d>0$,则建一条从新源点到该点的、容量为$d$的边,表示减下界的时候多减了,要加回来;

若$d<0$&#xff0c;则建一条从该点到新汇点的、容量为$-d$的边&#xff0c;表示加多了&#xff0c;要减回来。

3.旧汇点->旧源点&#xff0c;容量为$inf$&#xff0c;有借有还再借不难

然后求新图的最小费用最大流&#xff0c;答案即为最小费用&#43;所有边的费用*下界。

代码&#xff1a;

#include
#include

#include

#include

using namespace std;
typedef
long long ll;
const int N &#61; 350;
const int inf &#61; 0x3f3f3f3f;
const ll Inf &#61; 0x3f3f3f3f3f3f3f3fll;
template

inline
void read(T&x)
{T f
&#61; 1,c &#61; 0;char ch&#61;getchar();while(ch<&#39;0&#39;||ch>&#39;9&#39;){if(ch&#61;&#61;&#39;-&#39;)f&#61;-1;ch&#61;getchar();}while(ch>&#61;&#39;0&#39;&&ch<&#61;&#39;9&#39;){c&#61;c*10&#43;ch-&#39;0&#39;;ch&#61;getchar();}x &#61; f*c;
}
int n,hed[N],cnt&#61;-1,S,T,otd[N],ind[N],SS,TT;
struct EG
{
int to,nxt;ll f,w;
}e[
60*N];
void ae(int f,int t,ll fl,ll wl)
{e[
&#43;&#43;cnt].to &#61; t;e[cnt].nxt &#61; hed[f];e[cnt].f &#61; fl;e[cnt].w &#61; wl;hed[f] &#61; cnt;
}
void AE(int f,int t,ll fl,ll wl)
{ae(f,t,fl,wl);ae(t,f,
0,-wl);
}
int pre[N],fa[N];
ll dis[N],fl[N],ans;
bool vis[N];
bool spfa()
{queue
<int>q;memset(dis,0x3f,sizeof(dis));dis[SS]&#61;0,fl[SS]&#61;Inf,vis[SS]&#61;1;q.push(SS);while(!q.empty()){int u &#61; q.front();q.pop();for(int j&#61;hed[u];~j;j&#61;e[j].nxt){int to &#61; e[j].to;if(e[j].f&&dis[to]>dis[u]&#43;e[j].w){dis[to]&#61;dis[u]&#43;e[j].w;fl[to]&#61;min(fl[u],e[j].f);fa[to]&#61;u,pre[to]&#61;j;if(!vis[to]){vis[to]&#61;1;q.push(to);}}}vis[u]&#61;0;}return dis[TT]!&#61;Inf;
}
ll mcmf()
{ll ret
&#61; 0;while(spfa()){ret&#43;&#61;fl[TT]*dis[TT];int u &#61; TT;while(u!&#61;SS){e[pre[u]].f-&#61;fl[TT];e[pre[u]^1].f&#43;&#61;fl[TT];u&#61;fa[u];}}return ret;
}
int main()
{read(n);S
&#61;1,T&#61;n&#43;1;SS&#61;n&#43;2,TT&#61;n&#43;3;memset(hed,-1,sizeof(hed));for(int k,t,w,i&#61;1;i<&#61;n;i&#43;&#43;){read(k);while(k--){read(t),read(w);ind[t]&#43;&#43;,otd[i]&#43;&#43;;AE(i,t,inf,w);ans&#43;&#61;w;}if(i!&#61;1)AE(i,T,inf,0);}for(int i&#61;1;i<&#61;n&#43;1;i&#43;&#43;){int d &#61; ind[i]-otd[i];if(d<0)AE(i,TT,-d,0);else AE(SS,i,d,0);}AE(T,S,inf,0);ans&#43;&#61;mcmf();printf("%lld\n",ans);return 0;
}

 

转:https://www.cnblogs.com/LiGuanlin1124/p/10349141.html



推荐阅读
  • 李逍遥寻找仙药的迷阵之旅
    本文讲述了少年李逍遥为了救治婶婶的病情,前往仙灵岛寻找仙药的故事。他需要穿越一个由M×N个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • c语言\n不换行,c语言printf不换行
    本文目录一览:1、C语言不换行输入2、c语言的 ... [详细]
  • 本文介绍了一种划分和计数油田地块的方法。根据给定的条件,通过遍历和DFS算法,将符合条件的地块标记为不符合条件的地块,并进行计数。同时,还介绍了如何判断点是否在给定范围内的方法。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • 实现一个通讯录系统,可添加、删除、修改、查找、显示、清空、排序通讯录信息
    本文介绍了如何实现一个通讯录系统,该系统可以实现添加、删除、修改、查找、显示、清空、排序通讯录信息的功能。通过定义结构体LINK和PEOPLE来存储通讯录信息,使用相关函数来实现各项功能。详细介绍了每个功能的实现方法。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • IhaveconfiguredanactionforaremotenotificationwhenitarrivestomyiOsapp.Iwanttwodiff ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
author-avatar
突击手丶罪域
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有