poj 3613 floyd + 快速幂
题意:本题的大意就是问从S 到 T 经过边得个数恰为k的最短路是多少。
思路:对于邻接矩阵每一次floyd求的是每个点间的最短距离,则n次floyd就是每个点间n条路的最短距离(可以重复边);
但是由于k次floyd时间复杂度会超,则运用了快速幂的方法。
代码:
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <queue>
#define MAXN 1005
#define MAXM 500005
#define INF 1000000000
using namespace std;
int k, m, s, t;
int ans[MAXN][MAXN], mp[MAXN][MAXN], tmp[MAXN][MAXN], dis[MAXN][MAXN];
int used[MAXN], v[MAXN], num;
void floyd(int c[][MAXN], int a[][MAXN], int b[][MAXN])
{
for(int k = 0; k < num; k++)
for(int i = 0; i < num; i++)
for(int j = 0; j < num; j++)
if(c[v[i]][v[j]] > a[v[i]][v[k]] + b[v[k]][v[j]])
c[v[i]][v[j]] = a[v[i]][v[k]] + b[v[k]][v[j]];
}
void copy(int a[][MAXN], int b[][MAXN])
{
for(int i = 0; i < num; i++)
for(int j = 0; j < num; j++)
{
a[v[i]][v[j]] = b[v[i]][v[j]];
b[v[i]][v[j]] = INF;
}
}
void slove(int k)
{
while(k)
{
if(k & 1)
{
floyd(dis, ans, mp);
copy(ans, dis);
}
floyd(tmp, mp, mp);
copy(mp, tmp);
k >>= 1;
}
}
int main()
{
int x, y, w;
scanf("%d%d%d%d", &k, &m, &s, &t);
for(int i = 0; i <= 1000; i++)
{
for(int j = 0; j <= 1000; j++)
{
mp[i][j] = INF;
tmp[i][j] = INF;
dis[i][j] = INF;
ans[i][j] = INF;
}
ans[i][i] = 0;
}
num = 0;
for(int i = 0; i < m; i++)
{
scanf("%d%d%d", &w, &x, &y);
if(!used[x])
{
used[x] = 1;
v[num++] = x;
}
if(!used[y])
{
used[y] = 1;
v[num++] = y;
}
if(mp[x][y] > w)
mp[x][y] = mp[y][x] = w;
}
slove(k);
printf("%d\n", ans[s][t]);
return 0;
}
poj 3613 floyd + 快速幂的更多相关文章
- POJ 3613 Cow Relays(floyd+快速幂)
http://poj.org/problem?id=3613 题意: 求经过k条路径的最短路径. 思路: 如果看过<矩阵乘法在信息学的应用>这篇论文就会知道 现在我们在邻接矩阵中保存距离, ...
- POJ 3613 floyd+矩阵快速幂
题意: 求s到e恰好经过n边的最短路 思路: 这题已经被我放了好长时间了. 原来是不会矩阵乘法,快速幂什么的也一知半解 现在终于稍微明白了点了 其实就是把矩阵乘法稍微改改 改成能够满足结合律的矩阵&q ...
- poj 1995 裸快速幂
1. poj 1995 Raising Modulo Numbers 2.链接:http://poj.org/problem?id=1995 3.总结:今天七夕,来发水题纪念一下...入ACM这个坑 ...
- poj 3233 矩阵快速幂
地址 http://poj.org/problem?id=3233 大意是n维数组 最多k次方 结果模m的相加和是多少 Given a n × n matrix A and a positive i ...
- poj 3734 Blocks 快速幂+费马小定理+组合数学
题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...
- poj 3734 矩阵快速幂+YY
题目原意:N个方块排成一列,每个方块可涂成红.蓝.绿.黄.问红方块和绿方块都是偶数的方案的个数. sol:找规律列递推式+矩阵快速幂 设已经染完了i个方块将要染第i+1个方块. a[i]=1-i方块中 ...
- POJ 3070 矩阵快速幂解决fib问题
矩阵快速幂:http://www.cnblogs.com/atmacmer/p/5184736.html 题目链接 #include<iostream> #include<cstdi ...
- 解题报告:poj 3070 - 矩阵快速幂简单应用
2017-09-13 19:22:01 writer:pprp 题意很简单,就是通过矩阵快速幂进行运算,得到斐波那契数列靠后的位数 . 这是原理,实现部分就是矩阵的快速幂,也就是二分来做 矩阵快速幂可 ...
- POJ 1995 (快速幂)
这道题普通做法会发生溢出且会超时,应当用快速幂来求解. 快速幂讲解 #include <cstdio> #include <cmath> using namespace std ...
随机推荐
- Shopex如何清理缓存
一.进入后台,点击 右上角 的"关于" 二.点击:缓存系统: 三.点击"清空缓存" 四.清除成功!
- 模板 mú bǎn
链式前向星 #include<string.h> #define MAX 10000 struct node { int to,nex,wei; }edge[MAX*+]; ],cnt; ...
- iOS设置状态栏样式
iOS设置状态栏样式可以使用两种方式. 方式一: 直接在需要改变默认状态栏样式的控制器中实现一个方法(其他任何事情都不用做): // 返回状态栏的样式 - (UIStatusBarStyle)pref ...
- sysstat -6.0.2 lib not install
执行oracle安装包./setup.sh 后跳出,无法执行数据库的安装,并提示类似下面 的错误信息-- ERROR:===wed Aug 15 08:43:23 CST 2012===sysstat ...
- IOS开发之UITabBarController与UINavigationController混合使用
ios开发中UITabBarController与UINavigationController混合使用是很多app的基础页面结构,下面是简单的的页面初始化的方法,在AppDelegate.m的 - ( ...
- CSS3基础(4)——CSS3 渲染属性
一. CSS3 计数器详解 CSS3计数器(CSS Counters)可以允许我们使用CSS对页面中的任意元素进行计数,实现类似于有序列表的功能. 与有序列表相比,它的突出特性在于可以对任意元素 ...
- android学习笔记WebView的基本使用
WebView可以看做是一个浏览器,它使用了WebKit渲染引擎加载显示网页. WebView的使用需要掌握下面几点, 1,首先需要开启应用网络访问权限 在AndroidMinafest.xml中添加 ...
- ASP.NET MVC HtmlHelper用法大全
HTML扩展类的所有方法都有2个参数: 以textbox为例子public static string TextBox( this HtmlHelper htmlHelper, string name ...
- Qt版权符号显示问题
在个别界面中需要显示版权信息,其中©符号在界面上显示,有时会偏小或者显示为问号~ 其中一种解决办法用html的方式显示实体字符(©>Copyright© 2016</font>&qu ...
- Shell Script编程——USB挂载/复制文件/查找文件/压缩文件
PS:$引用变量的时候不要加空格.用了case,while的结构. main文件 #!/bin/bash chmod a+x changedate chmod a+x changemod chmod ...