最近学容斥的时候又碰到一道类似的题目,所以想分享一个套路,拿这题来举例

【题目描述】

给出一个\(N(N\leq 150)\)个结点的有向无环简单图。给出4个不同的点\(a,b,c,d\),定义不相交路径为两条路径,两条路径的起点分别为\(a\)和\(c\),对应的两条路径的终点为\(b\)和\(d\),要求满足这两条路径不相交,即两条路径上没有公共的点。 现在要求不相交路径的方案数。

【输入格式】

第一行为\(N,M\)。表示这个有向无环图有\(N\)个节点,\(M\)条边。 接下来\(M\)行,每行两个整数\(x,y\)。表示\(x\)至\(y\)有一条有向边。 接下来一行四个数\(a,b,c,d\),意义如题中所述。

【输出格式】

输出为一行,即答案(方案数)。

在写这题之前,先看另外一个问题:

一个\(N*M(N, M \le 100000)\)的矩阵,从\((0,0)\)出发,每次可以向上或者向右走一步,问有多少种方案到达点\((N,M)\)?

很显然,答案是\(C^N_{N*M}\)。

那如果规定有\(K\)个点是不能走的呢?\((k \le 1000)\)

如果直接递推的话肯定是会超时的 所以我们要使用一些数学方法

具体来说,合法方案数等于总方案数减去不合法方案数 废话

如果直接对于每个不合法点统计有多少路径经过它,然后用总数减去这些方案的话,很有可能会重复删减同一个方案,因为一种方案可能经过多个不合法点。

所以我们改变一下思路,设\(f[i]\)表示有多少路径第一个经过的不合法点为\(i\),最后用总方案数减去所有的\(f[i]\)。由于一条不合法路径无论如何都只会有一个【第一个经过的不合法点】,所以这种方法显然是正确的。

统计时,只需将所有不合法点先按照\(X,Y\)轴大小排好序,对于一个不合法点\(i\),\(f[i] = (从(0,0)到i点的方案数 - \sum f[j]) * 从i点到(N,M)\)的方案数,其中\(j\)是所有位于它左下方的点。

时间复杂度 \(O(k^2)\),这就是数学的力♂量

再看此题,类似的,我们可以设\(f[i]\)表示第一次相交在\(i\)点的情况数。

先用\(DP, Floyd\),等各种奇葩方法求出任意两点\(u, v\)从\(u\)到\(v\)的路径数。

然后按照拓扑序算出每个\(f[i]\),\(f[i] = (cnt[a][i] * cnt[b][i] - \sum f[j] * cnt[j][i]^2) * cnt[i][c] * cnt[i][d]\),\(j\)为每个拓扑序在\(i\)之前的点。

答案\(=\)总方案数 \(- \sum f[i]\)

【代码】

#include <iostream>
#include <cstdio>
using namespace std;
typedef long long ll; ll n, m, a, b, c, d, ans;
ll x[505][505], in[505], f[505][505], g[505];
ll que[5005], head = 1, tail; void toposort() {
for (int i = 1; i <= n; i++) {
if (in[i] == 0) que[++tail] = i, in[i] = -1;
}
while (head <= tail) {
ll c = que[head];
head++;
for (int i = 1; i <= n; i++) {
if (x[c][i]) {
in[i]--;
if (in[i] == 0) que[++tail] = i, in[i] = -1;
}
}
}
} int main() {
scanf("%lld %lld", &n, &m);
for (int i = 1; i <= m; i++) {
ll xx, yy;
scanf("%lld %lld", &xx, &yy);
x[xx][yy] = f[xx][yy] = 1;
in[yy]++;
}
scanf("%lld %lld %lld %lld", &a, &b, &c, &d);
toposort();
for (int i = 1; i <= n; i++) f[i][i] = 1;
for (int i = 1; i <= n; i++) {
for (int j = i + 1; j <= n; j++) {
ll u = que[i], v = que[j];
for (int k = 1; k <= n; k++) {
if (x[v][k]) {
f[u][k] += f[u][v];
}
}
}
}
ans = f[a][b] * f[c][d];
for (int i = 1; i <= n; i++) {
ll cur = que[i];
g[cur] = f[a][cur] * f[c][cur];
for (int j = i - 1; j >= 1; j--){
g[cur] -= g[que[j]] * f[que[j]][cur] * f[que[j]][cur];
}
ans -= g[cur] * f[cur][b] * f[cur][d];
}
printf("%lld\n", ans);
return 0;
}

不相交路径[BZOJ1471] 容斥原理 拓扑排序的更多相关文章

  1. 【BZOJ1471】不相交路径 题解(拓扑排序+动态规划+容斥原理)

    题目描述 在有向无环图上给你两个起点和终点分别为$a,b,c,d$.问有几种路径方案使得能从$a$走到$b$的同时能从$c$走到$d$,且两个路径没有交点. $1\leq n\leq 200,1\le ...

  2. 【bzoj4011】[HNOI2015]落忆枫音 容斥原理+拓扑排序+dp

    题目描述 给你一张 $n$ 个点 $m$ 条边的DAG,$1$ 号节点没有入边.再向这个DAG中加入边 $x\to y$ ,求形成的新图中以 $1$ 为根的外向树形图数目模 $10^9+7$ . 输入 ...

  3. [luogu3244 HNOI2015] 落忆枫音(容斥原理+拓扑排序)

    传送门 Description 给你一张 n 个点 m 条边的DAG,1 号节点没有入边.再向这个DAG中加入边 x→y ,求形成的新图中以 1 为根的外向树形图数 模 10^9+7 . Input ...

  4. ACM: HDU 1285 确定比赛名次 - 拓扑排序

     HDU 1285 确定比赛名次 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  5. Educational DP Contest G - Longest Path (dp,拓扑排序)

    题意:给你一张DAG,求图中的最长路径. 题解:用拓扑排序一个点一个点的拿掉,然后dp记录步数即可. 代码: int n,m; int a,b; vector<int> v[N]; int ...

  6. [bzoj 1471] 不相交路径 (容斥原理)

    题目描述 给出一个N(n<=150)N(n<=150)N(n<=150)个结点的有向无环简单图.给出444个不同的点aaa,bbb,ccc,ddd,定义不相交路径为两条路径,两条路径 ...

  7. POJ 1094 Sorting It All Out(拓扑排序+判环+拓扑路径唯一性确定)

    Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39602   Accepted: 13 ...

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

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

  9. [BZOJ4011][HNOI2015]落忆枫音:拓扑排序+容斥原理

    分析 又是一个有故事的题目背景.作为玩过原作的人,看题目背景都快看哭了ToT.强烈安利本境系列,话说SP-time的新作要咕到什么时候啊. 好像扯远了嘛不管了. 一句话题意就是求一个DAG再加上一条有 ...

随机推荐

  1. JVM(八):Java 对象模型

    JVM(八):Java 对象模型 本文将学习对象是如何创建的,对象的内存布局,以及如何定位访问一个对象. 对象创建 当虚拟机碰到一个new指令时,首先检查指令参数能否在常量池中定位一个类的符号引用,并 ...

  2. Windows 下配置 Logstash 为后台服务

    到目前为止,logstash 没有给出官方的,在 windows 系统中作为后台服务运行的方式.本文将介绍如何使用第三方工具 nssm 让 logstash 作为后台服务运行在 windows 中.说 ...

  3. TCP传输协议中如何解决丢包问题

    TCP在不可靠的网络上实现可靠的传输,必然会有丢包.TCP是一个“流”协议,一个详细的包将会被TCP拆分为好几个包上传,也是将会把小的封裝成大的上传,这就是说TCP粘包和拆包难题. 但是许多人有不同的 ...

  4. [Asp.net] C# 操作Excel的几种方式 优缺点比较

    在项目中我们常常需要将数据库中的数据导出成Excel文件 有一次工作中我的目的就是读取Excel到内存中,整理成指定格式 整理后再导出到Excel. 因为我要处理的每个Excel表格文件很大.一个表格 ...

  5. msf出现Database not connected等问题【已解决】

         kali启动msf后,出现Module database cache not built yet, using slow search,或是Database not connected,或是 ...

  6. SSH框架,xml配置实现动态定时器

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-// ...

  7. 【并查集】模板 + 【HDU 1213、HDU 1232、POJ 2236、POJ 1703】例题详解

    不想看模板,想直接看题目的请戳下面目录: 目录: HDU 1213 How Many Tables[传送门] HDU 1232 畅通工程 [传送门] POJ 2236 Wireless Network ...

  8. YOLO V1损失函数理解

    YOLO V1损失函数理解: 首先是理论部分,YOLO网络的实现这里就不赘述,这里主要解析YOLO损失函数这一部分. 损失函数分为三个部分: 代表cell中含有真实物体的中心. pr(object) ...

  9. K2 smarforms 控件整理

    K2 Community – Market – Smatform Controls l   K2 blackpearl 1.    Drag and Drop Upload Control http: ...

  10. Android CHM文件阅读器

    CHM格式是1998年微软推出的基于HTML文件特性的帮助文件系统.以替代早先的winHelp帮助系统,它也是一种超文本标识语言.在Windows 98中把CHM类型文件称作“已编译的HTML帮助文件 ...