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. C# Winform 模拟QQ新闻弹出框

    一开始做的时候,觉得这个太简单了.真心做的时候还是遇到了不少的坑啊. 1)循环播放新闻内容,建议使用showdialog(),不要用show(),不太好控制前后之间的停顿. 2)窗口的初始位置为有下角 ...

  2. js 使用(不断更新...)

    1.JS 对象(Object)和字符串(String)互转 var jsObj = {}; jsObj.testArray = [1, 2, 3, 4, 5]; jsObj.name = 'CSS3' ...

  3. django 笔记5 外键 ForeignKey

    class UsserGroup(models.Model): uid = models.AutoField(primary_key=True) caption = models.CharField( ...

  4. ios发布以后关键信息确认与nslog

    发布以后信息查看的路径: xcode->window->devices and …->查看如图的log. 通常在发布以后,处于安全和性能的考虑,会禁止打印log:但是在关键的信息需要 ...

  5. 【深度学习大讲堂】首期第一讲:人工智能的ABCDE 第二部分:简谈当前AI技术与发展趋势

    (完)

  6. Win10 + YOLOv3 环境配置,编译,实现目标检测----How to compile YOLOv3 on Windows

    其他比较好的参考链接: 环境配置: 环境配置的最终图片列表:https://blog.csdn.net/shanglianlm/article/details/80322718 视频讲解YOLOv1: ...

  7. Java基础学习总结(16)——Java制作证书的工具keytool用法总结

    一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...

  8. 网络载入数据和解析JSON格式数据案例之空气质量监測应用

    一.创建一个新的项目 activity_main.xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...

  9. storm 消息确认机制及可靠性

    worker进程死掉 在一个节点 kill work进程 比方 kill 2509  对work没有影响 由于会在其它节点又一次启动进程运行topology任务 supervisor进程死掉 supe ...

  10. jquery 表单重置通用方法

    $("#form_id").find(":input").not(":button,:submit,:reset,:hidden").val ...