题目描述

在有向无环图上给你两个起点和终点分别为$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. 准备开始了解orchardcore,有兴趣的一起啊

    orchardcore网上的资料真是少,开始看源码,目前遇到的最大问题是不知道ModuleName属性如何自动注入到OrchardCore.Cms.Web的程序集Assembly上面,等这个搞通了估计 ...

  2. 关于小白一天摆弄Axure产品原型的心得

    因为项目所需,被迫快速设计产品原型,制作app使用视频,这里简单分享一些一个小白第一次触碰产品原型设计的一些心得: 原型设计工具的选用 我这里针对的是贫穷学生党,分享的是自己尝试的几款.有钱大佬自行绕 ...

  3. Python 数字格式转换

    # 数字格式转换v1 '''a = input() a1 = list(a) b = ["零", "一", "二", "三&quo ...

  4. Maven 专题(三):为什么要用Maven

    1 真的需要吗? Maven 是干什么用的?这是很多同学在刚开始接触 Maven 时最大的问题.之所以会提出这个问题, 是因为即使不使用 Maven 我们仍然可以进行 B/S 结构项目的开发.从表述层 ...

  5. shell专题(十):Shell工具(重点)

    10.1 cut cut的工作就是“剪”,具体的说就是在文件中负责剪切数据用的.cut 命令从文件的每一行剪切字节.字符和字段并将这些字节.字符和字段输出. 1.基本用法 cut [选项参数]  fi ...

  6. python 爬虫,网页转PDF:OSError: No wkhtmltopdf executable found

    解决办法: 代码中设置参数: path_wk = r‘D:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe‘ #wkhtmltopdf安装位置 config ...

  7. 数据可视化之 图表篇(五) PowerBI图表不够炫酷?来看看这个

    现在这个大数据时代,每时每刻.各行各业都在产生多种多样的海量数据,如何简单高效的来理解.挖掘这些数据,发现背后的见解就非常重要. 本文介绍这个图表就可以帮你快速发现海量数据背后的见解,微软研究院打造的 ...

  8. C#各类集合介绍

    集合(Collection)类是专门用于数据存储和检索的类.这些类提供了对栈(stack).队列(queue).列表(list)和哈希表(hash table)的支持.大多数集合类实现了相同的接口. ...

  9. 自定义类支持foreach

    建议使用yield语句简化迭代 using System; using System.Collections; namespace 自定义类实现foreach { class A { int[] w; ...

  10. Alink漫谈(十一) :线性回归 之 L-BFGS优化

    Alink漫谈(十一) :线性回归 之 L-BFGS优化 目录 Alink漫谈(十一) :线性回归 之 L-BFGS优化 0x00 摘要 0x01 回顾 1.1 优化基本思路 1.2 各类优化方法 0 ...