BZOJ4386[POI2015]Wycieczki / Luogu3597[POI2015]WYC - 矩乘
Solution
想到边权为$1$的情况直接矩乘就可以得出长度$<=t$ 的路径条数, 然后二分check一下即可
但是拓展到边权为$2$,$3$ 时, 需要新建节点 $i+n$ 和 $i+2n$. 从 $i+n$ 到 $i$ 连边, $i+2n$ 到 $i+n$ 连边
若 $dis[j,i]=2$,则把 $j$ 向 $i+n$连边, 距离为 $3$时同理
但是发现这样点数就有 $3*N$ 个, 二分答案+矩乘的复杂度会非常高。
那么只能用和倍增求 $LCA$ 类似的解法, 二进制枚举
复杂度为$O(N^3 logk)$
Code
![](/assets/blank.gif)
![](/assets/blank.gif)
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define rd read() 5 #define ll long long 6 #define N 130 7 #define R register 8 using namespace std; 9 10 int n, up, m; 11 ll cnt; 12 13 int read() { 14 int X = 0, p = 1; char c = getchar(); 15 for (; c > '9' || c < '0'; c = getchar()) 16 if (c == '-') p = -1; 17 for (; c >= '0' && c <= '9'; c = getchar()) 18 X = X * 10 + c - '0'; 19 return X * p; 20 } 21 22 struct matrix { 23 ll mp[N][N]; 24 bool yue; 25 matrix() { 26 yue = false; 27 } 28 matrix operator * (const matrix &b) const { 29 matrix re; 30 memset(re.mp, 0, sizeof(re.mp)); 31 for (R int i = 0; i <= up; ++i) 32 for (R int j = 0; j <= up; ++j) { 33 for (R int k = 0; k <= up; ++k) 34 re.mp[i][j] += mp[i][k] * b.mp[k][j]; 35 if (re.mp[i][j] < 0) re.yue = true; 36 } 37 return re; 38 } 39 }ans, po[70]; 40 41 bool check(matrix tmp) { 42 ll rest = cnt; 43 if (tmp.yue) return 1; 44 for (int i = 1; i <= n; ++i) { 45 if (tmp.mp[i][0] < 0) return 1; 46 if (tmp.mp[i][0] - 1 >= rest) return 1; 47 rest -= tmp.mp[i][0] - 1; 48 } 49 return 0; 50 } 51 52 int main() 53 { 54 n = rd; m = rd; 55 up = n * 3; 56 scanf("%lld", &cnt); 57 po[0].mp[0][0] = 1; 58 for (int i = 1; i <= n; ++i) { 59 po[0].mp[i + n][i] = 1; 60 po[0].mp[i + 2 * n][i + n] = 1; 61 po[0].mp[i][0] = 1; 62 ans.mp[i][i] = 1; 63 } 64 for (R int i = 1; i <= m; ++i) { 65 int u = rd, v = rd, w = rd - 1; 66 po[0].mp[u][v + n * w]++; 67 } 68 bool flag = false; 69 int lim; 70 for (lim = 1; lim <= 65; ++lim) { 71 po[lim] = po[lim - 1] * po[lim - 1]; 72 if (check(po[lim])) { 73 flag = true; break; 74 } 75 } 76 if (!flag ) return puts("-1"), 0; 77 ll res = 0; 78 for (int i = lim; ~i; --i) { 79 matrix tmp = ans * po[i]; 80 if (!check(tmp)) ans = tmp, res += 1LL << i; 81 } 82 printf("%lld\n", res); 83 }
View Code
转载于:https://www.cnblogs.com/cychester/p/9848197.html
BZOJ4386[POI2015]Wycieczki / Luogu3597[POI2015]WYC - 矩乘相关推荐
- 【bzoj4386】[POI2015]Wycieczki 矩阵乘法
题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种. 将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 ...
- BZOJ 4386 Luogu P3597 [POI2015]Wycieczki (矩阵乘法)
题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4386 (luogu) https://www.luogu.org/pro ...
- [最新]免费伪原创SEO接口推荐
文章目录[隐藏] 前言 接口地址 接口参数说明 前言 其实市面上有很多的伪原创接口,但是许多接口都是收费的,最近在搜索时找到一个免费的接口感觉挺不错的推荐给大家. 接口地址 http://seowyc ...
- c语言定义int 输出4386,C语言 · 矩阵乘法
问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...
- #倍增+矩阵乘法# [luogu P3597] [POI2015]WYC
Title P3597 [POI2015]WYC Solution 注意这道题code中的一些细节 这道题做的我人都傻了,关键是有两种理解,但是关系不大. .. f[k][i][k]f[k][i][k ...
- POI2015 WYC
也许更好的阅读体验 Description\mathcal{Description}Description 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按 ...
- [Luogu P3597] [BZOJ 4386] [POI2015]WYC
洛谷传送门 BZOJ传送门 题目描述 给定一张nnn个点mmm条边的带权有向图,每条边的边权只可能是111,222,333中的一种.将所有可能的路径按路径长度排序,请输出第kkk小的路径的长度,注意路 ...
- 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)
3747: [POI2015]Kinoman Time Limit: 60 Sec Memory Limit: 128 MB Submit: 830 Solved: 338 Description ...
- [POI2015]CZA
[POI2015]CZA p很小,讨论 p=0... p=1... p=2:n-1放左或者放右两种情况,剩下怎么放是固定的,模拟然后判断即可 p=3: 正着做要状压,类似放书和排座位那些题,考虑以某个 ...
最新文章
- 【Efficient-Net】基于Efficient-Net效滤网的目标识别算法的MATLAB仿真
- JSP由浅入深(3)—— 通过表达式增加动态内容
- java控制语句案例_Java基础语法—流程控制语句
- 图像的熵、灰度平均值、灰度中值、方差
- 剑灵系统推荐加点_剑灵重制修炼系统 无定式加点打造自我风格
- Samba服务全攻略
- 前端学习(3165):react-hello-react之UUID库
- 突出重围:Oracle 10.2.0.5应用SCN补丁解决DB Link预警实践
- 百度起诉今日头条;腾讯云超 8000 名员工获 iPhone 11 Pro 奖励;PHP 7.4.1 发布 | 极客头条...
- UNIX环境高级编程 第11章 线程
- 动态规划 --- 13.1 Triangle ---- 相邻路径最小和 -- 图解
- 乌鲁木齐市建筑物矢量数据(Shp格式+带高度)
- WORD宏命令一(删除书签)
- php安装时候的源是什么,Windows安装源无效怎么办
- 射频识别(RFID)
- 苹果计算机单位换算,单位转换器 - 单位换算
- buuoj 小易的U盘
- 百度、阿里、腾讯、华为和移动等常用网盘免费空间与性价比
- 如何搜集你想要的信息
- Fluent Search