[luoguP2886] [USACO07NOV]牛继电器Cow Relays(矩阵)
矩阵快速幂,本质是floyd
把 * 改成 + 即可
注意初始化
因为只有100条边,所以可以离散化
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 101
#define min(x, y) ((x) < (y) ? (x) : (y)) int n, t, s, e, cnt;
int x[N], y[N], z[N], a[N]; struct Matrix
{
int n, m;
int a[N][N];
Matrix()
{
n = m = 0;
memset(a, 63, sizeof(a));
}
}; inline Matrix operator * (Matrix x, Matrix y)
{
int i, j, k;
Matrix ans;
ans.n = x.n;
ans.m = y.m;
for(i = 1; i <= x.n; i++)
for(j = 1; j <= y.m; j++)
for(k = 1; k <= y.n; k++)
ans.a[i][j] = min(ans.a[i][j], x.a[i][k] + y.a[k][j]);
return ans;
} inline Matrix operator ^ (Matrix x, int y)
{
int i;
Matrix ans;
ans.n = ans.m = cnt;
for(i = 1; i <= cnt; i++) ans.a[i][i] = 0;
for(; y; y >>= 1)
{
if(y & 1) ans = ans * x;
x = x * x;
}
return ans;
} int main()
{
int i;
Matrix sum;
scanf("%d %d %d %d", &n, &t, &s, &e);
a[++cnt] = s;
a[++cnt] = e;
for(i = 1; i <= t; i++)
{
scanf("%d %d %d", &z[i], &x[i], &y[i]);
a[++cnt] = x[i];
a[++cnt] = y[i];
}
std::sort(a + 1, a + cnt + 1);
cnt = std::unique(a + 1, a + cnt + 1) - (a + 1);
sum.n = sum.m = cnt;
for(i = 1; i <= t; i++)
{
x[i] = std::lower_bound(a + 1, a + cnt + 1, x[i]) - a;
y[i] = std::lower_bound(a + 1, a + cnt + 1, y[i]) - a;
sum.a[x[i]][y[i]] = z[i];
sum.a[y[i]][x[i]] = z[i];
}
sum = sum ^ n;
s = std::lower_bound(a + 1, a + cnt + 1, s) - a;
e = std::lower_bound(a + 1, a + cnt + 1, e) - a;
printf("%d\n", sum.a[s][e]);
return 0;
}
[luoguP2886] [USACO07NOV]牛继电器Cow Relays(矩阵)的更多相关文章
- P2886 [USACO07NOV]牛继电器Cow Relays
题目描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...
- [USACO07NOV]牛继电器Cow Relays
题目描述 给出一张无向连通图,求S到E经过k条边的最短路. 输入输出样例 输入样例#1: 2 6 6 4 11 4 6 4 4 8 8 4 9 6 6 8 2 6 9 3 8 9 输出样例#1: 10 ...
- 洛谷P2886 [USACO07NOV]牛继电器Cow Relays
题意很简单,给一张图,把基本的求起点到终点最短路改成求经过k条边的最短路. 求最短路常用的算法是dijkstra,SPFA,还有floyd. 考虑floyd的过程: c[i][j]=min(c[i][ ...
- [LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays
https://www.luogu.org/problemnew/show/P2886 给定无向连通图,求经过k条边,s到t的最短路 Floyd形式的矩阵乘法,同样满足结合律,所以可以进行快速幂. 离 ...
- 洛谷 P2886 [USACO07NOV]牛继电器Cow Relays
题面 解题思路 ## floyd+矩阵快速幂,跟GhostCai爷打赌用不用离散化,最后完败..GhostCai真是tql ! 有个巧妙的方法就是将节点重新编号,因为与节点无关. 代码 #includ ...
- Luogu 2886 [USACO07NOV]牛继电器Cow Relays
BZOJ 1706权限题. 倍增$floyd$. 首先这道题有用的点最多只有$200$个,先离散化. 设$f_{p, i, j}$表示经过$2^p$条边从$i$到$j$的最短路,那么有转移$f_{p, ...
- [USACO07NOV]牛继电器Cow Relays (最短路,DP)
题目链接 Solution 非正解 似乎比较蛇啊,先个一个部分分做法,最短路+\(DP\). 在求最短路的堆或者队列中存储元素 \(dis_{i,j}\) 代表 \(i\) 这个节点,走了 \(j\) ...
- luogu题解 P2886 【牛继电器Cow Relays】-经过K边最短路&矩阵
题目链接: https://www.luogu.org/problemnew/show/P2886 Update 6.16 最近看了下<算法导论>,惊奇地发现在在介绍\(APSP\) \( ...
- [洛谷P2886] 牛继电器Cow Relays
问题描述 For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race ...
随机推荐
- Codeforces Round #243 (Div. 1)
---恢复内容开始--- A 枚举l,r #include <iostream> #include<cstdio> #include<cstring> #inclu ...
- 代码文件导到word里
# 创建并写入word文档 import docx import sys import os dir = "D:\\gitwork\\fm.qimeng.c-class\\src\\main ...
- Python 基础语法学习(第一讲)---类的使用
[写在前面]:其实自学python有一段时间了,但是一直没想起来要写博客来记录自己的学习,今天才感觉要写点什么让自己学的更扎实一点,所以从今天开始更新python自学系列,希望看见文章的大佬们可以指点 ...
- uva1336 Fixing the Great Wall
用到了kase避免memset超时 #include<cstdio> #include<cstring> #include<cmath> #include<a ...
- C-基础:数组名与取地址符&
指出下面代码的输出,并解释为什么.(不错,对地址掌握的深入挖潜) main() { ]={,,,,}; ); printf(),*(ptr-)); } 输出:2,5 *(a+1)就是a[1], ...
- [ERROR ] Error parsing configuration file: /etc/salt/minion - conf should be a document, not <type 'str'>.
错误信息 [ERROR ] Error parsing configuration file: /etc/salt/minion - conf should be a document, not &l ...
- PyTorch的十七个损失函数
本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击: tensor-yu/PyTorch_Tutorialgithub.com 版权声明:本文为博主原创文章,转载请附上 ...
- WebGL 绘制Line的bug(一)
今天说点跟WebGL相关的事儿,不知道大家有没有碰到过类似的烦恼. 熟悉WebGL的同学都知道,WebGL绘制模式有点.线.面三种:通过点的绘制可以实现粒子系统等,通过线可以绘制一些连线关系:面就强大 ...
- vue 点击按钮弹窗,点击关闭按钮关闭弹窗。
<div @click="btnfc()">点击弹窗按钮</div> <div v-show="show"> <div ...
- 任务五:零基础HTML及CSS编码(二)
面向人群: 零基础或初学者 难度: 简单 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及学习难度的合理性,但即使如此,真正决定课 ...