[USACO07NOV]牛继电器Cow Relays

https://www.luogu.org/problem/P2886

题目描述:
给出一张无向连通图,求$S$到$E$经过$k$条边的最短路。

对于一类$S$到$E$走指定数量的边数,求它的最短路或条数,都可以采用矩阵快速幂的方式解决.我们回忆一下那一个慢得惊人的$floyd$算法,将它的$dp$方程式提取出来.

$floyd[i][j]=min(floyd[i][k]+floyd[k][j])$

如果我们把$floyd$看做一个矩阵,那么矩阵乘法的标准式则为:

$floyd[i][j]=\sum_{i=1}^{n}(floyd[i][k]×floyd[k][j])$

我们可以寻找这个方程的本质,可以发现,$(i,j)$的路径条数可以利用加乘原理,化为$(i,k)×(k,j)$的和,我们可以考虑这两个$dp$方程有什么相似之处.可以发现,上面的那个$dp$方程也可以用矩阵乘法的式子替代.我们可以将上面的$dp$式定义为矩阵$min$.现在我们可以考虑k的存在,走$k$条边的状态可以由a条边的状态与$k-a$条边的状态转移过来,如果我们将走k条边的状态看做一个矩阵,则$k$条边的状态可以正好看做$k$个$1$矩阵相乘,并用矩阵快速“$min$"加速.矩阵$min$易证是满足结合律的.

原问题便转化为了求一个矩阵的$k$次"$min$".现在我们来考虑初始状态:当$k$=1时,就为邻接矩阵.

注意:矩阵“$min$"没有单位元.
```
#include<iostream>
#include<algorithm>
using namespace std;
struct node
{
int map[201][201];
};
struct lisan
{
int num,data,newdata;
bool operator < (const lisan &a)const
{
return num<a.num;
}
};
bool cmp(lisan a,lisan b)
{
return a.data<b.data;
}
lisan l[301];
int n,t,s,e,edges[301][3],len,map[1001];
node now,c,res;
node mul(node a,node b)
{
for (int i=1;i<=200;++i)
for (int j=1;j<=200;++j)
c.map[i][j]=1e9;
for (int i=1;i<=200;++i)
for (int j=1;j<=200;++j)
for (int k=1;k<=200;++k)
c.map[i][j]=min(c.map[i][j],a.map[i][k]+b.map[k][j]);
return c;
}
node fast_pow(node a,int b)
{
if (b==1)
return a;
if (b&1)
return mul(fast_pow(mul(a,a),b/2),a);
else
return fast_pow(mul(a,a),b/2);
}
int main()
{
int useless=0;
cin>>n>>t>>s>>e;
for (int i=1;i<=200;++i)
for (int j=1;j<=200;++j)
now.map[i][j]=(1e9);
for (int i=1;i<=t;++i)
{
cin>>edges[i][2]>>edges[i][0]>>edges[i][1];
l[++len].data=edges[i][0];
l[len].num=len;
l[++len].data=edges[i][1];
l[len].num=len;
}
sort(l+1,l+len+1,cmp);
for (int i=1;i<=len;++i)
{
l[i].newdata=i-useless;
map[l[i].data]=l[i].newdata;
if (l[i].data==l[i+1].data)
useless++;
}
sort(l+1,l+len+1);
for (int i=1;i<=t;++i)
now.map[l[i*2-1].newdata][l[i*2].newdata]=now.map[l[i*2].newdata][l[i*2-1].newdata]=min(now.map[l[i*2-1].newdata][l[i*2].newdata],edges[i][2]);
res=fast_pow(now,n);
cout<<res.map[map[s]][map[e]]<<endl;
return 0;
}

原文地址:https://www.cnblogs.com/zhouhuanyi/p/12233039.html

时间: 2024-08-29 13:41:25

[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 using the T (2 ≤ T ≤ 100) cow trails throughout the pasture. Each trail connects two different intersections (1 ≤ I1i ≤ 1,000; 1 ≤ I2i ≤ 1,000), each

[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 {

[LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays

https://www.luogu.org/problemnew/show/P2886 给定无向连通图,求经过k条边,s到t的最短路 Floyd形式的矩阵乘法,同样满足结合律,所以可以进行快速幂. 离散化大可不必sort+unique,因为我们甚至并不在乎相对大小,只是要一个唯一编号,可以开一个桶记录 之所以进行k-1次快速幂,是因为邻接矩阵本身就走了一步了. #include<iostream> #include<cstring> #include<cstdio> u

Luogu P2886 [USACO07NOV]牛继电器Cow Relays|最短路,倍增

题目链接 题意:给出一张无向连通图,求S到E经过N条边的最短路. 数据范围:边数\(\le 100\),顶点编号\(\le1000\),\(N\le1 \times 10^6\) 题解: 最短路有三种解法,这种数据范围可使用\(floyd\) 可以用\(f[i][j][k]\)表示从\(i\)到\(j\)经过\(k\)条边的最短路,显然TLE 考虑倍增.预处理\(K=2^k\),此时\(f[i][j][k]=min\{f[i][l][k-1] + f[l][j][k-1]\}\) 将\(n\)二

POJ 3613 Cow Relays 恰好n步的最短路径

http://poj.org/problem?id=3613 题目大意: 有T条路,从s到e走n步,求最短路径. 思路: 看了别人的... 先看一下Floyd的核心思想: edge[i][j]=min(edge[i][j],edge[i][k]+edge[k][j]) i到j的最短路是i到j的直接路径或者经过k点的间接路径,但是矩阵的更新总是受到上一次更新的影响 如果每次的更新都存进新矩阵,那么edge[i][k]+edge[k][j]是不是表示只经过三个点两条边的路径呢? min(edge[i

矩阵十题【十】 poj 3613 Cow Relays

题目链接:http://poj.org/problem?id=3613 题目大意: 输入N,T,S,E,N表示要走的边数,T表示一共有几条边,S表示开始的点,E表示结束的点 给出一张无向连通图,求S到E经过N条边的最短路. N (2 ≤ N ≤ 1,000,000) T (2 ≤ T ≤ 100) (1 ≤ I1i ≤ 1,000; 1 ≤ I2i ≤ 1,000) 1 ≤ lengthi  ≤ 1,000 题目主要的思想就是用矩阵的乘法模拟出Floyd进行运算,是个很好的题目. //k步最短路

poj3613:Cow Relays(倍增优化+矩阵乘法floyd+快速幂)

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

洛谷P3045 [USACO12FEB]牛券Cow Coupons

P3045 [USACO12FEB]牛券Cow Coupons 71通过 248提交 题目提供者洛谷OnlineJudge 标签USACO2012云端 难度提高+/省选- 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨论 86分求救 题目描述 Farmer John needs new cows! There are N cows for sale (1 <= N <= 50,000), and FJ has to spend no more than his budget

poj 3613 Cow Relays

Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5411   Accepted: 2153 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