[bzoj 1471] 不相交路径 (容斥原理)
题目描述
给出一个N(n<=150)N(n<=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的拓扑序<i的拓扑序g[j]∗f[j][i]2g[i]=f[a][i]*f[c][i]-\sum_{j的拓扑序<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] 不相交路径 (容斥原理)的更多相关文章
- 不相交路径[BZOJ1471] 容斥原理 拓扑排序
最近学容斥的时候又碰到一道类似的题目,所以想分享一个套路,拿这题来举例 [题目描述] 给出一个\(N(N\leq 150)\)个结点的有向无环简单图.给出4个不同的点\(a,b,c,d\),定义不相交 ...
- LGV 引理——二维DAG上 n 点对不相交路径方案数
文章目录 引入 简介 定义 引理 证明 例题 释疑 扩展 引入 有这样一个问题: 甲和乙在一张网格图上,初始位置 ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_1,y_1),(x_ ...
- POJ Air Raid 【DAG的最小不相交路径覆盖】
传送门:http://poj.org/problem?id=1422 Air Raid Time Limit: 1000MS Memory Limit: 10000K Total Submissi ...
- [luoguP2765] 魔术球问题(最大流—最小不相交路径覆盖)
传送门 枚举球的个数 num 如果 i < j && (i + j) 是完全平方数,那么 i -> j' 连一条边 再加一个超级源点 s,s -> i 再加一个超级汇 ...
- Air Raid POJ - 1422 【有向无环图(DAG)的最小路径覆盖【最小不相交路径覆盖】 模板题】
Consider a town where all the streets are one-way and each street leads from one intersection to ano ...
- P2172 [国家集训队]部落战争 二分图最小不相交路径覆盖
二分图最小不相交路径覆盖 #include<bits/stdc++.h> using namespace std; ; ; ; ], nxt[MAXM << ], f[MAXM ...
- HDU 5852 Intersection is not allowed! ( 2016多校9、不相交路径的方案、LGV定理、行列式计算 )
题目链接 题意 : 给定方格中第一行的各个起点.再给定最后一行与起点相对应的终点.问你从这些起点出发到各自的终点.不相交的路径有多少条.移动方向只能向下或向右 分析 : 首先对于多起点和多终点的不相交 ...
- LGV - 求多条不相交路径的方案数
推荐博客 :https://blog.csdn.net/qq_25576697/article/details/81138213 链接:https://www.nowcoder.com/acm/con ...
- 【BZOJ1471】不相交路径 题解(拓扑排序+动态规划+容斥原理)
题目描述 在有向无环图上给你两个起点和终点分别为$a,b,c,d$.问有几种路径方案使得能从$a$走到$b$的同时能从$c$走到$d$,且两个路径没有交点. $1\leq n\leq 200,1\le ...
随机推荐
- dotnet Core学习之旅(二):安装IDE
[重要:文中所有外链不能确保永久有效] >开发工具 高效的开发必然需要一个优秀的集成开发环境(IDE) 对于.NET Core 2.x可以使用包括但不限于以下IDE来进行开发. Visual S ...
- Spring Boot使用@Value注解获取配置文件中的属性
获取配置文件的内容——
- Security Access Control Strategy && Method And Technology Research - 安全访问控制策略及其方法技术研究
1. 访问控制基本概念 访问控制是网络安全防范和客户端安全防御的重要基础策略,它的主要任务是保证资源不被非法使用.保证网络/客户端安全最重要的核心策略之一. 访问控制包括 入网访问控制 网络权限控制 ...
- 在论坛中出现的比较难的sql问题:18(字符合并 整数解析星期几)
原文:在论坛中出现的比较难的sql问题:18(字符合并 整数解析星期几) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...
- SQL Server2008分离数据库
1.右击数据库 2.Tasks 3.点击Detach 4.选取Drop Connections-->点击确定 5.开启本地数据库默认存储路径C:\Program Files\Microsoft ...
- POJ1573(Robot Motion)--简单模拟+简单dfs
题目在这里 题意 : 问你按照图中所给的提示走,多少步能走出来??? 其实只要根据这个提示走下去就行了.模拟每一步就OK,因为下一步的操作和上一步一样,所以简单dfs.如果出现loop状态,只要记忆每 ...
- 【转载】网站配置Https证书系列(三):IIS网站设置Http链接直接跳转Https安全连接
Http链接请求是以明文的方式传输,在传输的过程中很容易被篡改数据,一个典型的例子就是运营商的网络劫持注入广告信息等,而Https请求则是安全加密的请求,报文数据以密文的形式进行传输.当IIS网站配置 ...
- 【已解决】极速迅雷win10闪退解决方案
[已解决]极速迅雷win10闪退解决方案 本文作者:天析 作者邮箱:2200475850@qq.com 发布时间: Wed, 17 Jul 2019 18:01:00 +0800 在吾爱下载了个极速迅 ...
- HTML和XML中的转义字符
HTML中的转义字符 HTML中<, >,&等有特别含义,(前两个字符用于链接签,&用于转义),不能直接使用.使用这三个字符时,应使用他们的转义序列,如下所示: & ...
- kali 系统膨胀后如何处理
1.一般使用的kali 安装都是将系统文件全部放在一个总分区中,应用程序会产生临时文件,另外在安装软件的时候会出现 系统框架的不同,但是kali并不会检测该问题,直接当依赖的框架下载,可以是使用命令 ...