题目描述

在有向无环图上给你两个起点和终点分别为$a,b,c,d$。问有几种路径方案使得能从$a$走到$b$的同时能从$c$走到$d$,且两个路径没有交点。

$1\leq n\leq 200,1\leq m\leq 5000$。

--------------------------------------------------------------------

经过了深刻地思考,你会发现,由于这是一个$DAG$图,我们可以将其转化为动态规划来做,同时我们先要将图建立成一个拓扑图。

然后你又经过了深刻地思考,你会发现这道题还需要容斥原理。

假设$g[i]$是从$a_{1}$和$b_{1}$到共同点i的路径总方案数,则可以得

$g[i]=f[a_{1}][i]*f[b_{1}][i]-\sum_{k=1}^{i-1} g[k]*f[k][i]^2$

则可以得

$ans=f[a_{1}][b_{1}]*f[a_{2}][b_{2}]-\sum_{k=1}^{n} g[k]*f[k][a_{2}]*f[k][b_{2}]$

由于数据范围较小,知道了思路是个OIer都有方法将其实现,不存在卡时间的问题。

#include<bits/stdc++.h>
#define int unsigned long long
using namespace std;
const int maxn=;
struct node
{
int next,to;
}edge[];
int head[];
int g[maxn],f[maxn][maxn],in[maxn],pos[maxn];
int n,m,u,v,a,b,c,d,cnt,tot,ans;
queue<int> q;
void add(int from,int to)
{
edge[++tot].next=head[from];
edge[tot].to=to;
head[from]=tot;
in[to]++;
}
inline int read()
{
int x=,f=;char ch=getchar();
while(!isdigit(ch)){if (ch=='-') f=-;ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return x*f;
}
signed main()
{
n=read(),m=read();
for (int i=;i<=m;i++)
{
u=read(),v=read();
add(u,v);
}
a=read(),b=read(),c=read(),d=read();
for (int i=;i<=n;i++) if (!in[i]) q.push(i);
while(!q.empty())
{
int now=q.front();q.pop();
pos[++cnt]=now;
for (int i=head[now];i;i=edge[i].next)
{
int to=edge[i].to;
in[to]--;
if (!in[to]) q.push(to);
}
}
for (int i=;i<=n;i++)
{
u=pos[i];f[u][u]=;
for (int j=i;j<=n;j++)
{
v=pos[j];
for (int k=head[v];k;k=edge[k].next){
int to=edge[k].to;
f[u][to]+=f[u][v];
}
}
}
for (int i=;i<=n;i++)
{
u=pos[i];
g[u]=f[a][u]*f[c][u];
for (int j=;j<i;j++)
{
v=pos[j];
g[u]-=g[v]*f[v][u]*f[v][u];
}
}
ans=f[a][b]*f[c][d];
for (int i=;i<=n;i++) u=pos[i],ans-=g[u]*f[u][b]*f[u][d];
printf("%lld",ans);
return ;
}

【BZOJ1471】不相交路径 题解(拓扑排序+动态规划+容斥原理)的更多相关文章

  1. Wannafly挑战赛22 B 字符路径 ( 拓扑排序+dp )

    链接:https://ac.nowcoder.com/acm/contest/160/B 来源:牛客网 题目描述 给一个含n个点m条边的有向无环图(允许重边,点用1到n的整数表示),每条边上有一个字符 ...

  2. bzoj 1093 最大半连通子图 - Tarjan - 拓扑排序 - 动态规划

    一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u的有向路径.若G'=(V ...

  3. Luogu3953 NOIP2017逛公园(最短路+拓扑排序+动态规划)

    跑一遍dij根据最短路DAG进行拓扑排序,按拓扑序dp即可.wa了三发感觉非常凉. #include<iostream> #include<cstdio> #include&l ...

  4. 【题解】 [HNOI2015]落忆枫音 (拓扑排序+dp+容斥原理)

    原题戳我 Solution: (部分复制Navi_Aswon博客) 解释博客中的两个小地方: \[\sum_{\left(S是G中y→x的一条路径的点集\right))}\prod_{2≤j≤n,(j ...

  5. python拓扑排序

    发现自己并没有真的理解拓扑排序和多重继承,再次学习了下 拓扑排序要满足如下两个条件 每个顶点出现且只出现一次. 若A在序列中排在B的前面,则在图中不存在从B到A的路径. 拓扑排序算法 任何无回路的顶点 ...

  6. 【bzoj2815】[ZJOI2012]灾难 拓扑排序+倍增LCA

    题目描述(转自洛谷) 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过生物 ...

  7. 【bzoj4010】[HNOI2015]菜肴制作 拓扑排序+堆

    题目描述 给你一张有向图,问:编号-位置序(即每个编号的位置对应的序列)最小(例如1优先出现在前面,1位置相同的2优先出现在前面,以此类推)的拓扑序是什么? 输入 第一行是一个正整数D,表示数据组数. ...

  8. 【bzoj4562】[Haoi2016]食物链 拓扑排序+dp

    原文地址:http://www.cnblogs.com/GXZlegend/p/6832118.html 题目描述 如图所示为某生态系统的食物网示意图,据图回答第1小题 现在给你n个物种和m条能量流动 ...

  9. 【bzoj1565】[NOI2009]植物大战僵尸 拓扑排序+最大权闭合图

    原文地址:http://www.cnblogs.com/GXZlegend/p/6808268.html 题目描述 输入 输出 仅包含一个整数,表示可以获得的最大能源收入.注意,你也可以选择不进行任何 ...

随机推荐

  1. Pop!_OS安装与配置(二):基础配置

    Pop!_OS相关使用配置 #0x0 书接上回 #0x1 换源 #0x10 nopasswd sudo #0x11 换国内源 0x2 安装应用 #0x0 书接上回 首先请看上一章末尾, Pop!_OS ...

  2. Scala 基础(三):Scala语言快速开发入门

    1.Scala执行流程分析 2.Scala程序开发注意事项(重点) Scala源文件以 “.scala" 为扩展名. Scala程序的执行入口是main()函数. Scala语言严格区分大小 ...

  3. 数据库/MySQL的安装

    来源:https://www.cnblogs.com/liubing8/p/11431382.html mysql的安装.启动和基础配置 —— windows版本 1.下载 第一步:打开网址,http ...

  4. java 面向对象(十):关键字:this

    1.可以调用的结构:属性.方法:构造器2.this调用属性.方法:this理解为:当前对象 或 当前正在创建的对象 2.1 在类的方法中,我们可以使用"this.属性"或" ...

  5. SQLAlchemy(三):外键、连表关系

    SQLAlchemy03 /外键.连表关系 目录 SQLAlchemy03 /外键.连表关系 1.外键 2.ORM关系以及一对多 3.一对一的关系 4.多对多的关系 5.ORM层面的删除数据 6.OR ...

  6. 没错,用三方 Github 做授权登录就是这么简单!(OAuth2.0实战)

    本文收录在个人博客:www.chengxy-nds.top,技术资源共享. 上一篇<OAuth2.0 的四种授权方式>文末说过,后续要来一波OAuth2.0实战,耽误了几天今儿终于补上了. ...

  7. 毕业三年从月薪6K到20K

    首先,声明这不是标题党,是一个真实的北漂故事!     为什么写这篇文章呢?第一,有感而发,感恩遇到的人和事,其次,希望对读这篇文章的你有所帮助 毕业那年 时间追溯到17年6月30号,那天毕业典礼,之 ...

  8. 入门大数据---Hive计算引擎Tez简介和使用

    一.前言 Hive默认计算引擎时MR,为了提高计算速度,我们可以改为Tez引擎.至于为什么提高了计算速度,可以参考下图: 用Hive直接编写MR程序,假设有四个有依赖关系的MR作业,上图中,绿色是Re ...

  9. iview实战 : 全屏去头去尾的弹窗

    <template> <Button @click="modal3 = true" >No title bar</Button> <Mod ...

  10. python-闭包和装饰器-02-装饰器(decorator)

    装饰器(decorator) 理解了上一章的闭包之后,装饰器就是闭包的一种应用,只是外部函数的参数传入的不是普通的变量类型,而是传入一个函数名.装饰器一般用于:不修改被装饰函数(即外部函数传入的参数) ...