博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2807 The Shortest Path 矩阵
阅读量:5269 次
发布时间:2019-06-14

本文共 2364 字,大约阅读时间需要 7 分钟。

题意:

  有N个顶点,每个顶点由M*M矩阵构成,  对于顶点 A, B,C, 若 A*B = C,则存在一条路 (a,c)路径为1,

  K次询问,问 (x,y)最短路径。 N,M 《= 100

解法:

  用矩阵乘法 暴力找出 顶点间关系, 然后Floyd跑一次。

  好久没写矩阵乘法了。顺便当模板敲一次。

View Code
#include
#include
#include
#include
using namespace std;const int inf = 0x3f3f3f3f;const int N = 101;int n, m; struct Matrix{ int mat[N][N]; Matrix(){ memset(mat,0,sizeof(mat)); } void input(){ for(int i = 0; i < m; i++) for(int j = 0; j < m; j++) scanf("%d",&mat[i][j] ); } void unit(){ memset(mat,0,sizeof(mat)); for(int i = 0; i < m; i++) mat[i][i] = 1; } Matrix& operator = (const Matrix &a){ memcpy( mat, a.mat, sizeof(a.mat)); return *this; } friend Matrix operator * (const Matrix &a, const Matrix &b){ Matrix res; for(int i = 0; i < m; i++) for(int k = 0; k < m; k++) if( a.mat[i][k] ) for(int j = 0; j < m; j++) res.mat[i][j] += a.mat[i][k]*b.mat[k][j]; return res; } friend bool operator == (const Matrix &a, const Matrix &b){ for(int i = 0; i < m; i++) for(int j = 0; j < m; j++) if( a.mat[i][j] != b.mat[i][j] ) return false; return true; } };int dis[N][N];Matrix A[N];void floyd(){ for(int k = 0; k < n; k++) for(int i = 0; i < n; i++) if( dis[i][k] != inf ) for(int j = 0; j < n; j++) if( dis[i][j] > dis[i][k] + dis[k][j] ) dis[i][j] = dis[i][k] + dis[k][j]; }int main(){ while( scanf("%d%d", &n,&m), n+m ){ for(int i = 0; i < n; i++) A[i].input(); memset(dis, 0x3f, sizeof(dis)); for(int i = 0; i < n; i++) for(int j = 0; j < n; j++){ Matrix t = A[i]*A[j]; for(int k = 0; k < n; k++) if( t == A[k] && (k!=i && k!=j) )//不明觉厉... dis[i][k] = 1; } floyd(); int a, b, k;scanf("%d", &k); for(int i = 0; i < k; i++){ scanf("%d%d",&a,&b); if( dis[a-1][b-1] == inf ) printf("Sorry\n"); else printf("%d\n", dis[a-1][b-1] ); } } return 0;}

 

转载于:https://www.cnblogs.com/yefeng1627/archive/2013/04/22/3036786.html

你可能感兴趣的文章
Unity调用Windows窗口句柄,选择文件和目录
查看>>
HashMap循环遍历方式
查看>>
React Native 入门 调试项目
查看>>
C# 通过 Quartz .NET 实现 schedule job 的处理
查看>>
关于java之socket输入流输出流可否放在不同的线程里进行处理
查看>>
目前为止用过的最好的Json互转工具类ConvertJson
查看>>
JavaScript的学习要点
查看>>
Day13
查看>>
tensorflow saver简介+Demo with linear-model
查看>>
Luogu_4103 [HEOI2014]大工程
查看>>
Oracle——SQL基础
查看>>
项目置顶随笔
查看>>
Redis的安装与使用
查看>>
P1970 花匠
查看>>
java语言与java技术
查看>>
NOIP2016提高A组五校联考2总结
查看>>
对其他团队的项目的意见或建议
查看>>
iOS 项目的编译速度提高
查看>>
机房收费系统——报表
查看>>
How to unshelve many shelves at same time
查看>>