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][j],edge[i][k]+edge[k][j])就表示仅仅经过三个点两条边的最短路。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MAXN=256;
const int INF=0x3fffffff;
int num[MAXN<<2];
int n,t,s,e,cnt;
struct Matrix
{
LL data[MAXN][MAXN];
Matrix()
{
for(int i=0;i<MAXN;i++)
for(int j=0;j<MAXN;j++)
data[i][j]=INF;
} Matrix & operator = (const Matrix &x )
{
for(int i=0;i<cnt;i++)
for(int j=0;j<cnt;j++)
data[i][j]=x.data[i][j];
return *this;
} //这里不返回引用出错。。。我记得C++不是不建议返回局部变量的引用么?
Matrix& operator * (const Matrix & x)
{
Matrix res; for(int k=0;k<cnt;k++)
for(int i=0;i<cnt;i++)
for(int j=0;j<cnt;j++)
res.data[i][j]=min(res.data[i][j],data[i][k]+x.data[k][j]); return res;
}
}a,b; void mypow()
{
for(int i=0;i<cnt;i++)
b.data[i][i]=0; while(n)
{
if(n&1)
b=b*a;
a=a*a;
n>>=1;
}
} int main()
{
cnt=0;
scanf("%d%d%d%d",&n,&t,&s,&e);
int from,to,val;
memset(num,-1,sizeof(num));
for(int i=0;i<t;i++)
{
scanf("%d%d%d",&val,&from,&to);
if(num[from]==-1) num[from]=cnt++;
if(num[to]==-1) num[to]=cnt++;
from=num[from];
to=num[to];
a.data[from][to]=a.data[to][from]=val;
}
mypow();
printf("%d\n",b.data[ num[s] ][ num[e] ]);
return 0; }
POJ 3613 Cow Relays 恰好n步的最短路径的更多相关文章
- Poj 3613 Cow Relays (图论)
Poj 3613 Cow Relays (图论) 题目大意 给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度 理论上讲就是给了有n条边限制的最短路 solution 最一开始想 ...
- poj 3613 Cow Relays
Cow Relays Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5411 Accepted: 2153 Descri ...
- POJ 3613 Cow Relays(floyd+快速幂)
http://poj.org/problem?id=3613 题意: 求经过k条路径的最短路径. 思路: 如果看过<矩阵乘法在信息学的应用>这篇论文就会知道 现在我们在邻接矩阵中保存距离, ...
- POJ 3613 Cow Relays【k边最短路】
题目链接:http://poj.org/problem?id=3613 题目大意: 给出n头牛,t条有向边,起点以及终点,限制每头牛放在一个点上,(一个点上可以放多头牛),从起点开始进行接力跑到终点, ...
- 【floyd+矩阵乘法】POJ 3613 Cow Relays
Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a rel ...
- poj 3613 Cow Relays(矩阵的图论意义)
题解 用一个矩阵来表示一个图的边的存在性,即矩阵C[i,j]=1表示有一条从i到j的有向边C[i,j]=0表示没有从i到j的边.这个矩阵的k次方后C[i,j]就表示有多少条从i到j恰好经过k条边的路径 ...
- POJ 3613 Cow Relays (floyd + 矩阵高速幂)
题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B B[i][j] 就表示 i-j 刚好走过两条路的方法数 那么同理 我们把 ...
- poj 3613 Cow Relays【矩阵快速幂+Floyd】
!:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...
- POJ 3613 [ Cow Relays ] DP,矩阵乘法
解题思路 首先考虑最暴力的做法.对于每一步,我们都可以枚举每一条边,然后更新每两点之间经过\(k\)条边的最短路径.但是这样复杂度无法接受,我们考虑优化. 由于点数较少(其实最多只有\(200\)个点 ...
随机推荐
- css3模糊图片
image的css样式 filter: blur(10px); -webkit-filter: blur(10px); -moz-filter: blur(10px); -ms-filter: blu ...
- MFC中CFileDialog使用方法
用CFileDialog选择了一个文件后,使用FILE::fopen打开文件错误,使用 的是相对地址.和王工调试了半天,怎么跟踪也没发现错误,原来如此. .... .. . . CFileDialog ...
- less14 颜色函数2
less div{ // hue()色相值 z-index: hue(hsl(90,100%,50%)); //90 ////saturation()饱和度 z-index: saturation(h ...
- rest_framework 视图
视图: a.过去 class PagerView(View): pass b.现在 class Pager1View(APIView): pass c.rest_framework 基本没用 from ...
- Why functions - Not only for python
It may not be clear why it is worth the trouble to divide a program into functions. There are a lot ...
- Python中的self(Python笔记)
self Python中类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值.这个特别的变量指对象本身,按 ...
- js动态创建 select选择框
document.body.onclick = function(){ if(document.getElementById('vselect') === null){ document.body.i ...
- SQL Server在用户自定义函数(UDF)中使用临时表
SQL Server在用户自定义函数中UDF使用临时表,这是不允许的. 有时是为了某些特殊的场景, 我们可以这样的实现: CREATE TABLE #temp (id INT) GO INSERT I ...
- highGUI图形用户界面
#include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace ...
- appium 模拟实现物理按键点击
appium自动化测试中,当确认,搜索,返回等按键通过定位点击不好实现的时候,可以借助物理按键来实现.appium支持以下物理按键模拟: 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ ...