题目描述

给出一个N(n&lt;=150)N(n&lt;=150)N(n<=150)个结点的有向无环简单图。给出444个不同的点aaa,bbb,ccc,ddd,定义不相交路径为两条路径,两条路径的起点分别为aaa和ccc,对应的两条路径的终点为bbb和ddd,要求满足这两条路径不相交,即两条路径上没有公共的点。 现在要求不相交路径的方案数。

题目分析

这道题类似于[bzoj 4767] 两双手

记f[i][j]f[i][j]f[i][j]表示从iii走到jjj路径条数

g[i]g[i]g[i]表示两个点从a,ca,ca,c开始走第一次相遇在i点的方案数

根据容斥常识,则有:

g[i]=f[a][i]∗f[c][i]−∑j的拓扑序&lt;i的拓扑序g[j]∗f[j][i]2g[i]=f[a][i]*f[c][i]-\sum_{j的拓扑序&lt;i的拓扑序}g[j]*f[j][i]^2g[i]=f[a][i]∗f[c][i]−∑j的拓扑序<i的拓扑序​g[j]∗f[j][i]2

求最终答案也容斥一下:

Ans=f[a][b]∗f[c][d]−∑g[i]∗f[i][b]∗f[i][d]Ans=f[a][b]*f[c][d]-\sum g[i]*f[i][b]*f[i][d]Ans=f[a][b]∗f[c][d]−∑g[i]∗f[i][b]∗f[i][d]

所以Θ(n3)\Theta(n^3)Θ(n3)预处理fff

所以Θ(n2)\Theta(n^2)Θ(n2)求出ggg

所以Θ(n)\Theta(n)Θ(n)求出AnsAnsAns

时间复杂度Θ(n3)\Theta(n^3)Θ(n3)

upd:法2:高论

  • 考虑这两个位置第⼀次相交在u,那么可以a->u->c, b->u->d变成 b->u->c, a->u->d。

    所以答案为dp[a][c]*dp[b][d]-dp[b][c]*dp[a][d]

类似LGV Lemma 但是并不满足“一定相交”条件,这里的正确性是两条路径的特殊性导致的。

AC code

法1:100ms

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 155;
int n, m, d[MAXN], fir[MAXN], to[MAXN*MAXN], nxt[MAXN*MAXN], cnt;
inline void Add(int u, int v) { to[++cnt] = v, nxt[cnt] = fir[u], fir[u] = cnt, ++d[v]; }
int topo[MAXN], id[MAXN], cur, q[MAXN], s, t; //topo为拓扑序,id为topo的反函数
long long f[MAXN][MAXN], g[MAXN];
int main ()
{
scanf("%d%d", &n, &m);
for(int i = 1, x, y; i <= m; ++i)
scanf("%d%d", &x, &y), Add(x, y);
for(int i = 1; i <= n; ++i) if(!d[i]) q[t++] = i;
while(s < t) //拓扑排序
{
int u = q[s++]; id[topo[u] = ++cur] = u;
for(int i = fir[u]; i; i = nxt[i])
if(--d[to[i]] == 0) q[t++] = to[i];
}
for(int i = 1, u; i <= n; ++i)
{
u = id[i]; f[u][u] = 1;
for(int j = i, v; j <= n; ++j)
{
v = id[j];
for(int k = fir[v]; k; k = nxt[k]) f[u][to[k]] += f[u][v];
}
}
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
for(int i = 1, u; i <= n; ++i)
{
u = id[i];
g[u] = f[a][u] * f[c][u];
for(int j = 1, v; j < i; ++j)
{
v = id[j];
g[u] -= g[v] * f[v][u] * f[v][u];
}
}
long long ans = f[a][b] * f[c][d];
for(int i = 1, u; i <= n; ++i)
{
u = id[i];
ans -= g[u] * f[u][b] * f[u][d];
}
printf("%lld\n", ans);
}

法2:80ms

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 155;
int n, m, d[MAXN], fir[MAXN], to[MAXN*MAXN], nxt[MAXN*MAXN], cnt;
inline void Add(int u, int v) { to[++cnt] = v, nxt[cnt] = fir[u], fir[u] = cnt, ++d[v]; }
int topo[MAXN], id[MAXN], cur, q[MAXN], s, t; //topo为拓扑序,id为topo的反函数
long long f[MAXN][MAXN];
int main ()
{
scanf("%d%d", &n, &m);
for(int i = 1, x, y; i <= m; ++i)
scanf("%d%d", &x, &y), Add(x, y);
for(int i = 1; i <= n; ++i) if(!d[i]) q[t++] = i;
while(s < t) //拓扑排序
{
int u = q[s++]; id[topo[u] = ++cur] = u;
for(int i = fir[u]; i; i = nxt[i])
if(--d[to[i]] == 0) q[t++] = to[i];
}
for(int i = 1, u; i <= n; ++i)
{
u = id[i]; f[u][u] = 1;
for(int j = i, v; j <= n; ++j)
{
v = id[j];
for(int k = fir[v]; k; k = nxt[k]) f[u][to[k]] += f[u][v];
}
}
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
long long ans = f[a][b] * f[c][d] - f[c][b] * f[a][d];
printf("%lld\n", ans);
}

[bzoj 1471] 不相交路径 (容斥原理)的更多相关文章

  1. 不相交路径[BZOJ1471] 容斥原理 拓扑排序

    最近学容斥的时候又碰到一道类似的题目,所以想分享一个套路,拿这题来举例 [题目描述] 给出一个\(N(N\leq 150)\)个结点的有向无环简单图.给出4个不同的点\(a,b,c,d\),定义不相交 ...

  2. LGV 引理——二维DAG上 n 点对不相交路径方案数

    文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_ ...

  3. POJ Air Raid 【DAG的最小不相交路径覆盖】

    传送门:http://poj.org/problem?id=1422 Air Raid Time Limit: 1000MS   Memory Limit: 10000K Total Submissi ...

  4. [luoguP2765] 魔术球问题(最大流—最小不相交路径覆盖)

    传送门 枚举球的个数 num 如果 i < j && (i + j) 是完全平方数,那么 i -> j' 连一条边 再加一个超级源点 s,s -> i 再加一个超级汇 ...

  5. Air Raid POJ - 1422 【有向无环图(DAG)的最小路径覆盖【最小不相交路径覆盖】 模板题】

    Consider a town where all the streets are one-way and each street leads from one intersection to ano ...

  6. P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖

    二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; ; ; ; ], nxt[MAXM << ], f[MAXM ...

  7. HDU 5852 Intersection is not allowed! ( 2016多校9、不相交路径的方案、LGV定理、行列式计算 )

    题目链接 题意 : 给定方格中第一行的各个起点.再给定最后一行与起点相对应的终点.问你从这些起点出发到各自的终点.不相交的路径有多少条.移动方向只能向下或向右 分析 : 首先对于多起点和多终点的不相交 ...

  8. LGV - 求多条不相交路径的方案数

    推荐博客 :https://blog.csdn.net/qq_25576697/article/details/81138213 链接:https://www.nowcoder.com/acm/con ...

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

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

随机推荐

  1. [转帖]Epoll和IOCP的比较

    Epoll和IOCP的比较 https://yq.aliyun.com/articles/53621/   kryptosx 2016-05-27 23:32:51 浏览6181   原来整理过一个& ...

  2. [转帖]浅谈响应式编程(Reactive Programming)

    浅谈响应式编程(Reactive Programming) https://www.jianshu.com/p/1765f658200a 例子写的非常好呢. 0.9312018.02.14 21:22 ...

  3. todo---git 生成密钥 原理分析

    ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRJkDZ2z7syFC2QDCaORKF41ecwbL/kyFwkycOVE3MavTRBliAhoAhOaZQTr4j ...

  4. 【Docker】:全面认识Docker和基本指令

    Docker逐渐成为虚拟化技术的佼佼者,接下来会推出一系列的Docker相关技术文章,Docker技术也是架构师的必备技能. 什么是Docker Docker 是一个开源的应用容器引擎,基于Go语言, ...

  5. JAVA基础学习_命名规范和注释

    一.命名规范 1. 项目名全部小写 2. 包名统一使用小写,点分隔符之间有且仅有一个自然语义的英语单词,包名统一使用单数形式.如果类名有复数含义,类名可以使用复数形式. 实际应用中: 各层命名规约: ...

  6. C#-Parallel

    using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Li ...

  7. 将网站升级为https并自动续期Https证书。

    Let's Encrypt Let's Encrypt 是一个由Internet Security Research Group (互联网安全研究组)提供的免费,自动化和开放的证书颁发机构. 它秉承着 ...

  8. Go 操作 Mysql(二)

    查询数据方法回顾整理 上一篇博客中,主要是快速过了一遍 demo 代码和 DB 类型对象中方法的使用 在整理查询数据方法的时候,使用了 Query() 方法,其实 sqlx 还提供了 QueryRow ...

  9. iOS - starckView 类似Android线性布局

    同iOS以往每个迭代一样,iOS 9带来了很多新特性.UIKit框架每个版本都在改变,而在iOS 9比较特别的是UIStackView,它将从根本上改变开发者在iOS上创建用户界面的方式.本文将带你学 ...

  10. vue实现一个评论列表

    <!DOCTYPE html> <html> <head> <title>简易评论列表</title> <meta charset=& ...