热门标签 | 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个方格组成的迷阵,有些方格内有怪物,有些方格是安全的。李逍遥需要避开有怪物的方格,并经过最少的方格,找到仙药。在寻找的过程中,他还会遇到神秘人物。本文提供了一个迷阵样例及李逍遥找到仙药的路线。 ... [详细]
  • 本文介绍了Codeforces Round #321 (Div. 2)比赛中的问题Kefa and Dishes,通过状压和spfa算法解决了这个问题。给定一个有向图,求在不超过m步的情况下,能获得的最大权值和。点不能重复走。文章详细介绍了问题的题意、解题思路和代码实现。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个数列求和问题,该数列按照一定规律生成。通过观察数列的规律,我们可以得出求解该问题的算法。具体算法为计算前n项i*f[i]的和,其中f[i]表示数列中有i个数字。根据参考的思路,我们可以将算法的时间复杂度控制在O(n),即计算到5e5即可满足1e9的要求。 ... [详细]
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • 本文介绍了一道经典的状态压缩题目——关灯问题2,并提供了解决该问题的算法思路。通过使用二进制表示灯的状态,并枚举所有可能的状态,可以求解出最少按按钮的次数,从而将所有灯关掉。本文还对状压和位运算进行了解释,并指出了该方法的适用性和局限性。 ... [详细]
  • linux进阶50——无锁CAS
    1.概念比较并交换(compareandswap,CAS),是原⼦操作的⼀种,可⽤于在多线程编程中实现不被打断的数据交换操作࿰ ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了解决二叉树层序创建问题的方法。通过使用队列结构体和二叉树结构体,实现了入队和出队操作,并提供了判断队列是否为空的函数。详细介绍了解决该问题的步骤和流程。 ... [详细]
  • 本文为Codeforces 1294A题目的解析,主要讨论了Collecting Coins整除+不整除问题。文章详细介绍了题目的背景和要求,并给出了解题思路和代码实现。同时提供了在线测评地址和相关参考链接。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 开发笔记:实验7的文件读写操作
    本文介绍了使用C++的ofstream和ifstream类进行文件读写操作的方法,包括创建文件、写入文件和读取文件的过程。同时还介绍了如何判断文件是否成功打开和关闭文件的方法。通过本文的学习,读者可以了解如何在C++中进行文件读写操作。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 本文介绍了SPOJ2829题目的解法及优化方法。题目要求找出满足一定条件的数列,并对结果取模。文章详细解释了解题思路和算法实现,并提出了使用FMT优化的方法。最后,对于第三个限制条件,作者给出了处理方法。文章最后给出了代码实现。 ... [详细]
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社区 版权所有