【t044】弗洛伊德
Time Limit: 1 second
Memory Limit: 128 MB
【问题描述】
弗洛伊德是一个大牛!给一个有向图G,他有n个结点,现在请你求出对于他的每一对结点(x,y),从x出发走恰好k条边以后恰
好到达结点y的路径条数。
【输入格式】
输入文件第一行包含两个正整数n,k。(1<=n<=50,1<=k<=100)
接下来n行,每行n个用空格隔开的数。若第i行第j个数为1,则表示i到j在G中有一条边直接相连,若为0,则没有边直接相
连。
【输出格式】
输出文件包含n行,每行n个用空格隔开的数。表示从i出发走恰好k条边到达j的方案数。为了避免数字太大,请将所有数对8000取模。
Sample Input
2 1
0 1
1 0
Sample Output
0 1
1 0
【题解】
可以验证一下
3 2
0 1 0
0 0 1
0 0 0
->
0 0 1
0 0 0
0 0 0
表示只有一条路径从1到3是恰好走2格的。
答案就是改矩阵的K次方。
加一个快速幂就能过了。
和普通的乘法运算不同。
矩阵乘法的快速幂,退出条件为now<=1;而不是now=0;
因为now=1的时候没有必要再进行乘法运算了。因为一开始的初始状态就对于矩阵的1次方。
再乘会错解;
【代码】
#include <cstdio> const int MAXN = 51;
const int MOD = 8000; int n, k,a[MAXN][MAXN],temp[MAXN][MAXN],temp1[MAXN][MAXN]; void input_data()
{
scanf("%d%d", &n, &k);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
scanf("%d", &a[i][j]);
temp[i][j] = a[i][j];
}
} void solve(int now)
{
if (now == 1)
return;
solve(now >> 1);
for (int i = 1;i <= n;i++)//每行乘每列!
for (int what = 1; what <= n; what++)//这三个for可以自己推下。
{
temp1[i][what] = 0;
for (int j = 1; j <= n; j++)
temp1[i][what] = (temp1[i][what] + temp[i][j] * temp[j][what]) % 8000;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
temp[i][j] = temp1[i][j];
if ((now %2)==1)
{
for (int i = 1; i <= n; i++)
for (int what = 1; what <= n; what++)
{
temp1[i][what] = 0;
for (int j = 1; j <= n; j++)
temp1[i][what] = (temp1[i][what] + temp[i][j] * a[j][what]) % 8000;
}
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
temp[i][j] = temp1[i][j];
}
} void output_ans()
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n - 1; j++)
printf("%d ", temp[i][j]);
printf("%d\n", temp[i][n]);
} } int main()
{
//freopen("F:\\rush.txt", "r", stdin);
//freopen("F:\\rush_out.txt", "w", stdout);
input_data();
solve(k);
output_ans();
return 0;
}
【t044】弗洛伊德的更多相关文章
- Leetcode 166. Fraction to Recurring Decimal 弗洛伊德判环
		分数转小数,要求输出循环小数 如2 3 输出0.(6) 弗洛伊德判环的原理是在一个圈里,如果一个人的速度是另一个人的两倍,那个人就能追上另一个人.代码中one就是速度1的人,而two就是速度为2的人. ... 
- Leetcode 202 Happy Number 弗洛伊德判环解循环
		今天先谈下弗洛伊德判环,弗洛伊德判环原来是在一个圈内有两人跑步,同时起跑,一人的速度是另一人的两倍,则那个人能在下一圈追上另一个人,弗洛伊德判环能解数字会循环出现的题,比如说判断一个链表是不是循环链表 ... 
- AC日记——产生数 codevs 1009 (弗洛伊德)(组合数学)
		1009 产生数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Descriptio ... 
- Floyd算法(弗洛伊德算法)
		算法描述: Floyd算法又称为弗洛伊德算法,插点法,是一种用于寻找给定的加权图中顶点间最短路径的算法.从图的带权邻接矩阵A=[a(i,j)] n×n开始,递归地进行n次更新,即由矩阵D(0)=A,按 ... 
- C# 弗洛伊德(Floyd)算法
		弗洛伊德(Floyd)算法 主要是用于计算图中所有顶点对之间的最短距离长度的算法,如果是要求某一个特定点到图中所有顶点之间的最短距离可以用; ; ; ; ... 
- 弗洛伊德(Floyd)算法
		#include <stdio.h> #define MAXVEX 20 //最大顶点数 #define INFINITY 65535 //∞ typedef struct {/* 图结构 ... 
- 数据结构C语言版 弗洛伊德算法实现
		/* 数据结构C语言版 弗洛伊德算法 P191 编译环境:Dev-C++ 4.9.9.2 */ #include <stdio.h>#include <limits.h> # ... 
- POJ 3660	Cow Contest 弗洛伊德
		题意难懂是POJ的标配,这都TM赖本泽马. 题意:有N头牛进行了M场比赛,比赛双方是A - B 且总是A赢(前面的那个数赢),如果说A赢B,B赢C 则可以确定A赢C.问最终多少头牛的排名可以确定. 思 ... 
- BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德
		BZOJ_[usaco2007 Nov]relays 奶牛接力跑_离散化+倍增弗洛伊德 Description FJ的N(2 <= N <= 1,000,000)头奶牛选择了接力跑作为她们 ... 
随机推荐
- cocos2dx3.0项目创建流程
			cocos2dx3.0不是beta,新增了wp项目创建的支持 但不知道为啥非beta版本号的tools文件夹中取消了project-creator,可能有更改吧 没有这个工具还挺麻烦.就自己手动创建c ... 
- Directx11教程41 纹理映射(11)
			原文:Directx11教程41 纹理映射(11) 1.第一副图我们采用各性异性的滤波方式,并设置最大各性异性值为8. samplerDesc.Filter = D3D11_FILT ... 
- react-jd-index
			看见一些代码的产物,会觉得非常的漂亮~感谢无私开源的程序员们~你们是最可爱的人儿~~ //index.jsx require('./app/lib/common.css'); import React ... 
- @codeforces - 717A@ Festival Organization
			目录 @description@ @solution@ @accepted code@ @details@ @description@ 一个长度为 n 的 01 序列是好的,当且仅当该序列任意两个 0 ... 
- QT,QLabel添加超链接
			1.方法1:使用信号槽绑定方式 //设置超链接并绑定信号槽QLabel *linkLabel = new QLabel(); linkLabel->setText("<a hre ... 
- MyBatis映射文件的基本功能
			#{}与${}区别 "#{}"使用的是preparedStatement方式预处理,就是使用了占位符来填充数据防止SQL注入. ${}使用的是statement方式进行sql语句的 ... 
- C++讲课总结                                                                                                         标签:               c++总结                                            2015-02-28 14:48             671人阅读              评论(25)              收藏
			昨天老师算是给串了一本C++ 的课本,根据自己的理解,赶紧记录一下,也好作为自己学习时候的根据. C++编程简介:每本讲语言的书,第一章总是简介,内容无非是发展历史,语言特色等东西,专业的东西不多,都 ... 
- QT自定义窗口
			qt 中允许自定义窗口控件,使之满足特殊要求, (1)可以修改其显示,自行绘制 (2)可以动态显示 (3)可以添加事件,支持鼠标和键盘操作 自定义控件可以直接在QtDesigner里使用,可以直接加到 ... 
- Resharper 如何把类里的类移动到其他文件
			有时候,看到一个类里有很多类,需要把他移动其他文件 假如有一个类 class A { class B { } } 如何把 B 移动文件 B里? 一般使用 快捷键是 Resharper 的快捷键,如果不 ... 
- python selenium 获取对象输入的属性值
			.get_attribute("value") from selenium import webdriver import time driver=webdriver.Firefo ... 
