Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7335   Accepted: 2878 Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout…
Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7825   Accepted: 3068 Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout…
解题报告 感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊. 题意 给定一个T(2 <= T <= 100)条边的无向图,求S到E恰好经过N(2 <= N <= 1000000)条边的最短路. Idea 用Floyd和矩阵快速幂优化的产物.具体等咱下了课再好好说... 用一个矩阵a(i, j)来表示i到j经过若干条边的最短路,初始化a为i到j边的长度,没有则是正无穷. 然后重载*运算符,比如a矩阵表示经过n…
题目链接 先离散化,假设有\(P\)个点 定义矩阵\(A_{ij}\)表示\(i\)到\(j\)只经过一条边的最短路,\[{(A^{a+b})_{ij}=\min_{1\le k\le p} \{ (A^a)_{ik}+(A^b)_{kj} \}}\] \(A^{a+b}_{ij}\)表示\(i\)到\(j\)经过\((a+b)\)条边的最短路. 这不就是\(ddp\)里常用的广义矩阵乘法吗,直接上快速幂即可. #include <cstdio> #include <cstring>…
图的存储有邻接矩阵,那么他就具备一些矩阵的性质,设有一个图的demo[100][100];那么demo[M][N]就是M—>N的距离,若经过一次松弛操作demo[M][N]=demo[M][K]+demo[K][N],即为demo[M][N]经过了两条条边的最小距离,floyd是 demo[M][N]=Min(demo[M][K]+demo[K][N],demo[M][N]),有可能两点之间直接距离最短,不经过第三边,那我们不考虑不经过两点之间的情况,那么demo[M][N]等于  demo[M…
Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:9207   Accepted: 3604 Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout t…
唔不知道怎么说--大概核心是把矩阵快速幂的乘法部分变成了Floyd一样的东西,非常之神 首先把点离散一下,最多有200个,然后建立邻接矩阵,a[u][v]为(u,v)之间的距离,没路就是inf 然后注意重载乘号的部分,注意到这样乘一次就相当于把本来存了经过k条路的最短路的邻接矩阵变成存了经过k+1条路的最短路的邻接矩阵 这样看来乘n次就行了,这里用矩阵快速幂 妙啊 #include<iostream> #include<cstdio> using namespace std; co…
题目大概要求从起点到终点恰好经过k条边的最短路. 离散数学告诉我们邻接矩阵的k次幂就能得出恰好经过k条路的信息,比如POJ2778. 这题也一样,矩阵的幂运算定义成min,而min满足结合律,所以可以用快速幂求解. 另外这题点的序号要离散化一下,最多也就200个点. #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define INF (1<<29) i…
网上有优化的方法 就是乘上一个一维的矩阵:现在还没有想通.想通了不上代码: 我用的就是普通的矩阵,压着时间过:只是多了一个判断条件,不加这个条件就超时: #include<stdio.h> #include<string.h> #define INF 99999999 #define maxn 85 struct Mat { int mat[maxn][maxn]; }a[]; int n,m,map[maxn][maxn]; Mat operator * (Mat a,Mat b…
link 题目大意 给你一个含有边权的无向图,问从$S$到$T$经过$N$条边的最小花费. 试题分析 我们可以很容易推导$dp$方程,$dp(k,i,j)$表示经过$k$条边从$i$到$j$的最小花费.则,$dp(k,i,j)=min(dp(k-1,i,p)+dp(1,p,j))$. 而$(i,p),(p,j),(i,j)$发现了什么,这不是矩阵吗,$dp(1,i,j)$为初始矩阵($1$次幂),$dp(2,i,j)$为$2$次幂,$dp(3,i,j)$为$3$次幂,所以只需要矩阵快速幂一下即可…