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步的最短路径的更多相关文章

  1. Poj 3613 Cow Relays (图论)

    Poj 3613 Cow Relays (图论) 题目大意 给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度 理论上讲就是给了有n条边限制的最短路 solution 最一开始想 ...

  2. poj 3613 Cow Relays

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5411   Accepted: 2153 Descri ...

  3. POJ 3613 Cow Relays(floyd+快速幂)

    http://poj.org/problem?id=3613 题意: 求经过k条路径的最短路径. 思路: 如果看过<矩阵乘法在信息学的应用>这篇论文就会知道 现在我们在邻接矩阵中保存距离, ...

  4. POJ 3613 Cow Relays【k边最短路】

    题目链接:http://poj.org/problem?id=3613 题目大意: 给出n头牛,t条有向边,起点以及终点,限制每头牛放在一个点上,(一个点上可以放多头牛),从起点开始进行接力跑到终点, ...

  5. 【floyd+矩阵乘法】POJ 3613 Cow Relays

    Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a rel ...

  6. poj 3613 Cow Relays(矩阵的图论意义)

    题解 用一个矩阵来表示一个图的边的存在性,即矩阵C[i,j]=1表示有一条从i到j的有向边C[i,j]=0表示没有从i到j的边.这个矩阵的k次方后C[i,j]就表示有多少条从i到j恰好经过k条边的路径 ...

  7. POJ 3613 Cow Relays (floyd + 矩阵高速幂)

    题目大意: 求刚好经过K条路的最短路 我们知道假设一个矩阵A[i][j] 表示表示 i-j 是否可达 那么 A*A=B  B[i][j]  就表示   i-j 刚好走过两条路的方法数 那么同理 我们把 ...

  8. poj 3613 Cow Relays【矩阵快速幂+Floyd】

    !:自环也算一条路径 矩阵快速幂,把矩阵乘法的部分替换成Floyd(只用一个点扩张),这样每"乘"一次,就是经过增加一条边的最短路,用矩阵快速幂优化,然后因为边数是100级别的,所 ...

  9. POJ 3613 [ Cow Relays ] DP,矩阵乘法

    解题思路 首先考虑最暴力的做法.对于每一步,我们都可以枚举每一条边,然后更新每两点之间经过\(k\)条边的最短路径.但是这样复杂度无法接受,我们考虑优化. 由于点数较少(其实最多只有\(200\)个点 ...

随机推荐

  1. css3模糊图片

    image的css样式 filter: blur(10px); -webkit-filter: blur(10px); -moz-filter: blur(10px); -ms-filter: blu ...

  2. MFC中CFileDialog使用方法

    用CFileDialog选择了一个文件后,使用FILE::fopen打开文件错误,使用 的是相对地址.和王工调试了半天,怎么跟踪也没发现错误,原来如此. .... .. . . CFileDialog ...

  3. less14 颜色函数2

    less div{ // hue()色相值 z-index: hue(hsl(90,100%,50%)); //90 ////saturation()饱和度 z-index: saturation(h ...

  4. rest_framework 视图

    视图: a.过去 class PagerView(View): pass b.现在 class Pager1View(APIView): pass c.rest_framework 基本没用 from ...

  5. 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 ...

  6. Python中的self(Python笔记)

    self Python中类的方法与普通的函数只有一个特别的区别——它们必须有一个额外的第一个参数名称,但是在调用这个方法的时候你不为这个参数赋值,Python会提供这个值.这个特别的变量指对象本身,按 ...

  7. js动态创建 select选择框

    document.body.onclick = function(){ if(document.getElementById('vselect') === null){ document.body.i ...

  8. SQL Server在用户自定义函数(UDF)中使用临时表

    SQL Server在用户自定义函数中UDF使用临时表,这是不允许的. 有时是为了某些特殊的场景, 我们可以这样的实现: CREATE TABLE #temp (id INT) GO INSERT I ...

  9. highGUI图形用户界面

    #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> using namespace ...

  10. appium 模拟实现物理按键点击

    appium自动化测试中,当确认,搜索,返回等按键通过定位点击不好实现的时候,可以借助物理按键来实现.appium支持以下物理按键模拟: 电话键 KEYCODE_CALL 拨号键 5 KEYCODE_ ...