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

 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 - 矩乘相关推荐

  1. 【bzoj4386】[POI2015]Wycieczki 矩阵乘法

    题目描述 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种. 将所有可能的路径按路径长度排序,请输出第k小的路径的长度,注意路径不一定是简单路径,即可以重复走同一个点. 输入 ...

  2. BZOJ 4386 Luogu P3597 [POI2015]Wycieczki (矩阵乘法)

    题目链接: (bzoj) https://www.lydsy.com/JudgeOnline/problem.php?id=4386 (luogu) https://www.luogu.org/pro ...

  3. [最新]免费伪原创SEO接口推荐

    文章目录[隐藏] 前言 接口地址 接口参数说明 前言 其实市面上有很多的伪原创接口,但是许多接口都是收费的,最近在搜索时找到一个免费的接口感觉挺不错的推荐给大家. 接口地址 http://seowyc ...

  4. c语言定义int 输出4386,C语言 · 矩阵乘法

    问题描述 输入两个矩阵,分别是m*s,s*n大小.输出两个矩阵相乘的结果. 输入格式 第一行,空格隔开的三个正整数m,s,n(均不超过200). 接下来m行,每行s个空格隔开的整数,表示矩阵A(i,j ...

  5. #倍增+矩阵乘法# [luogu P3597] [POI2015]WYC

    Title P3597 [POI2015]WYC Solution 注意这道题code中的一些细节 这道题做的我人都傻了,关键是有两种理解,但是关系不大. .. f[k][i][k]f[k][i][k ...

  6. POI2015 WYC

    也许更好的阅读体验 Description\mathcal{Description}Description 给定一张n个点m条边的带权有向图,每条边的边权只可能是1,2,3中的一种.将所有可能的路径按 ...

  7. [Luogu P3597] [BZOJ 4386] [POI2015]WYC

    洛谷传送门 BZOJ传送门 题目描述 给定一张nnn个点mmm条边的带权有向图,每条边的边权只可能是111,222,333中的一种.将所有可能的路径按路径长度排序,请输出第kkk小的路径的长度,注意路 ...

  8. 【BZOJ 3747】 3747: [POI2015]Kinoman (线段树)

    3747: [POI2015]Kinoman Time Limit: 60 Sec  Memory Limit: 128 MB Submit: 830  Solved: 338 Description ...

  9. [POI2015]CZA

    [POI2015]CZA p很小,讨论 p=0... p=1... p=2:n-1放左或者放右两种情况,剩下怎么放是固定的,模拟然后判断即可 p=3: 正着做要状压,类似放书和排座位那些题,考虑以某个 ...

最新文章

  1. 【Efficient-Net】基于Efficient-Net效滤网的目标识别算法的MATLAB仿真
  2. JSP由浅入深(3)—— 通过表达式增加动态内容
  3. java控制语句案例_Java基础语法—流程控制语句
  4. 图像的熵、灰度平均值、灰度中值、方差
  5. 剑灵系统推荐加点_剑灵重制修炼系统 无定式加点打造自我风格
  6. Samba服务全攻略
  7. 前端学习(3165):react-hello-react之UUID库
  8. 突出重围:Oracle 10.2.0.5应用SCN补丁解决DB Link预警实践
  9. 百度起诉今日头条;腾讯云超 8000 名员工获 iPhone 11 Pro 奖励;PHP 7.4.1 发布 | 极客头条...
  10. UNIX环境高级编程 第11章 线程
  11. 动态规划 --- 13.1 Triangle ---- 相邻路径最小和 -- 图解
  12. 乌鲁木齐市建筑物矢量数据(Shp格式+带高度)
  13. WORD宏命令一(删除书签)
  14. php安装时候的源是什么,Windows安装源无效怎么办
  15. 射频识别(RFID)
  16. 苹果计算机单位换算,单位转换器 - 单位换算
  17. buuoj 小易的U盘
  18. 百度、阿里、腾讯、华为和移动等常用网盘免费空间与性价比
  19. 如何搜集你想要的信息
  20. Fluent Search

热门文章

  1. 基于 TensorFlow 的逻辑回归详解
  2. 遭到别人恶意的批评,你是如何回应的?
  3. 使用python tkinter做window窗体界面程序,以及python多线程处理解决tk界面卡死
  4. 微信内置浏览器动态生成二维码并长按识别
  5. 【Markdown】 实现上角标和下角标的两种方法(详细讲解!!!)
  6. Asp.NetCore实现一个简单的手机号码验证
  7. autofs服务之光盘自动挂载
  8. Bootstrap 调用默认的CSS文件的时候使用style去设置属性
  9. 手把手教你微信开发者工具引入Vant
  10. EDATE和EOMONTH函数的用法和区别