题目链接

/*
*题目大意:
*求出从i到j,刚好经过k条边的最短路;
*
*矩阵乘法的应用之一(国家队论文):
*矩阵乘法不满足交换律,矩阵乘法满足结合律;
*给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值;
*把给定的图转为邻接矩阵,即A(i,j)=1当且仅当存在一条边i->j;
*令C=A*A,那么C(i,j)=ΣA(i,k)*A(k,j),实际上就等于从点i到点j恰好经过2条边的路径数(枚举k为中转点);
*类似地,C*A的第i行第j列就表示从i到j经过3条边的路径数;
*同理,如果要求经过k步的路径数,只需要二分求出A^k即可;
*
*算法思想:
*类似于快速幂的矩阵相乘的方法,只是把相乘部分改成floyd;
*基于动态规划:d[i][j][k],表示点i到j有2^k条路径的最短路;
*INF值很奇怪,各种数据都感觉不合适,换了很多次才过;
**/
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<queue>
#include<cstdio>
#include<climits>
#include<algorithm>
using namespace std; const int MAXN=222;
const int MAXM=1111;
//const int INF=0xfffffff;
const int INF=999999999; int f[MAXM];
int cnt;
int map[MAXN][MAXN];
int res[MAXN][MAXN],tmp[MAXN][MAXN];//res[i][j]表示i与j之间的最短路(之间有n条路),这个n是时刻变化的 int N,T,S,E;
void solve(int n)//就像快速幂的矩阵连乘,只是把相乘部分改成floyd
{
while(n)
{
if(n%2)//n为奇数时,n=2^a+2^a+b,这里补上b步,后面计算2*2^a步;
{
for(int i=1; i<=cnt; i++)
for(int j=1; j<=cnt; j++)
tmp[i][j]=INF; for(int k=1; k<=cnt; k++)
for(int i=1; i<=cnt; i++)
for(int j=1; j<=cnt; j++)
if(tmp[i][j]>res[i][k]+map[k][j])
tmp[i][j]=res[i][k]+map[k][j]; for(int i=1; i<=cnt; i++)
for(int j=1; j<=cnt; j++)
res[i][j]=tmp[i][j];
} for(int i=1; i<=cnt; i++)
for(int j=1; j<=cnt; j++)
tmp[i][j]=INF;
for(int k=1; k<=cnt; k++)
for(int i=1; i<=cnt; i++)
for(int j=1; j<=cnt; j++)
if(tmp[i][j]>map[i][k]+map[k][j])
tmp[i][j]=map[i][k]+map[k][j]; for(int i=1; i<=cnt; i++)
for(int j=1; j<=cnt; j++)
map[i][j]=tmp[i][j]; n=n/2;
}
return;
} int main()
{
//freopen("C:\\Users\\Administrator\\Desktop\\kd.txt","r",stdin);
while(~scanf("%d%d%d%d",&N,&T,&S,&E))
{
for(int i=0; i<=MAXN; i++)
{
for(int j=0; j<=MAXN; j++)
map[i][j]=INF,res[i][j]=INF;
res[i][i]=0;
}
memset(f,0,sizeof(f));
cnt=0;
int u,v,w;
for(int i=1; i<=T; i++)
{
scanf("%d%d%d",&w,&u,&v);
if(f[u]==0)
{
cnt++;
f[u]=cnt;
}
if(f[v]==0)
{
cnt++;
f[v]=cnt;
}
map[f[u]][f[v]]=w;
map[f[v]][f[u]]=w;
}
solve(N);
printf("%d\n",res[f[S]][f[E]]);
}
return 0;
}

图论专题训练1-D(K步最短路,矩阵连乘)的更多相关文章

  1. POJ --- 3613 (K步最短路+矩阵快速幂+floyd)

    Cow Relays   Description For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided ...

  2. 专题训练——[kuangbin带你飞]最短路练习

    最短路练习 0. Til the Cows Come Home  POJ - 2387 完美的模板题 //#include<Windows.h> #include<iostream& ...

  3. luogu题解 P2886 【牛继电器Cow Relays】-经过K边最短路&矩阵

    题目链接: https://www.luogu.org/problemnew/show/P2886 Update 6.16 最近看了下<算法导论>,惊奇地发现在在介绍\(APSP\) \( ...

  4. poj3613Cow Relays——k边最短路(矩阵快速幂)

    题目:http://poj.org/problem?id=3613 题意就是求从起点到终点的一条恰好经过k条边的最短路: floyd+矩阵快速幂,矩阵中的第i行第j列表示从i到j的最短路,矩阵本身代表 ...

  5. DP专题训练之HDU 2955 Robberies

    打算专题训练下DP,做一道帖一道吧~~现在的代码风格完全变了~~大概是懒了.所以.将就着看吧~哈哈 Description The aspiring Roy the Robber has seen a ...

  6. dp专题训练

    ****************************************************************************************** 动态规划 专题训练 ...

  7. hdu 2157 从a点走到b点刚好k步的方案数是多少 (矩阵快速幂)

    n个点 m条路 询问T次 从a点走到b点刚好k步的方案数是多少 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把 给定的图转为邻接矩阵,即A(i,j)=1当且仅当存 ...

  8. 经典矩阵快速幂之二-----hdu2157(走k步到

    题意:(中问题,题意很简单 思路:a走k步到b,其实就是A^k,ans.mat[a][b]就是答案. 其实就是离散的邻接矩阵那个P(不想证明,逃 #include<cstdio> #inc ...

  9. 正睿OI国庆DAY2:图论专题

    正睿OI国庆DAY2:图论专题 dfs/例题 判断无向图之间是否存在至少三条点不相交的简单路径 一个想法是最大流(后来说可以做,但是是多项式时间做法 旁边GavinZheng神仙在谈最小生成树 陈主力 ...

随机推荐

  1. 【C++模版之旅】静态多态的讨论

    说到面向对象特性之一“多态”,以我的水平已经说不出太多新意了.相信很多程序员代码K多了,做梦都在“多态中”运行着.常规的多态是C++语义内置支持的一种特性,通过虚函数可以实现这个特性,为了后面以示区别 ...

  2. Django之验证码 + session 认证

    验证码 + session认证 目录结构 . └── project ├── app01 │   ├── admin.py │   ├── apps.py │   ├── __init__.py │  ...

  3. ibatis使用--SqlMapClient对象

    SqlMapClient对象 这个对象是iBatis操作数据库的接口(执行CRUD等操作),它也可以执行事务管理等操作.这个类是我们使用iBATIS的最主要的类.它是线程安全的.通常,将它定义为单例. ...

  4. C++11 多线程 教学(2)

      C++11开始支持多线程编程,之前多线程编程都需要系统的支持,在不同的系统下创建线程需要不同的API如pthread_create(),Createthread(),beginthread()等, ...

  5. Android 打造形形色色的进度条 实现可以如此简单

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/43371299 ,本文出自:[张鸿洋的博客] 1.概述 最近需要用进度条,秉着不重 ...

  6. 使用xdebug+eclipse远程调试centOS7上的PHP代码

    这两天一直在研究PHP代码的调试,原来开发一直用的var_dump,麻烦! 最近发现能使用xdebug+eclipse远程单步调试PHP,但是百度后实现此技术的文章都写得不够具体. 我照着这里零散的文 ...

  7. Web Api Session开启会话支持

        1.WebApi中默认是没有开启Session会话支持的.需要在Global中重写Init方法来指定会话需要支持的类型           //代码如下 public override voi ...

  8. 安装软件配置VC++环境时常出现的问题--Error 1935.安装程序集

    装很多软件是都要配置VC++环境的,但由于系统注册表限制,很多时候软件安装过程中会报如下错误 安装 vc++2005 运行库 Error 1935.安装程序集 Microsoft.vc80.atl,t ...

  9. ajax传递json数据,springmvc后台就收json数据

    1.ajax数据的封装 var json = {"token":token};//封装json数据 $.ajax({ url:'', data:JSON.stringify(jso ...

  10. Palindrome Number 回文数

    判断一个数字是否是回文数,尝试不用其他额外空间. 注意: 负数也有可能成为回文数吗? 如果你想让int转为string,注意不用其他空间这个约束. 你也可以翻转一个int,但是有可能会溢出.     ...