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

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

最短路。全源最短路,使用floyd

给你很多个矩阵,每个矩阵代表一个点,两点之间有一条有向边(A->C,权值为1)当且仅当A*B=C(矩阵运算),其中A,B,C代表不同的点。然后给很多个查询,每次问你从一个点到另一个点的最短路。

主要注意上述A,B,C指代不同的点。

矩阵相乘放在第二层循环得出结果,再和第三层枚举的每个矩阵比较。

话说刚刚看了一下别的题解,居然发现还有 快速矩阵比较 这种东西,能O(n)完成矩阵比较?。。太秀了

#include 
#include
#include
#include
#include
#include
using namespace std;const int INF = 1e9;const int MAX = 81;int N, M, Q;int mtx[MAX][MAX][MAX];int d[MAX][MAX]; // 邻接矩阵int t[MAX][MAX]; // 存储矩阵乘积的临时矩阵void init(){ for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (i != j) d[i][j] = INF; else d[i][j] = 0; // 使用邻接矩阵时这一步还是必要的,至少稳当 } }}void mul(int a, int b) // a*b=c{ int s; for (int i = 1; i <= M; i++) { for (int j = 1; j <= M; j++) { s = 0; for (int k = 1; k <= M; k++) { s += mtx[a][i][k] * mtx[b][k][j]; } t[i][j] = s; } }}void floyd(){ for (int k = 1; k <= N; k++) for (int i = 1; i <= N; i++) for (int j = 1; j <= N; j++) { if(d[i][k] != INF && d[k][j] != INF && d[i][k] + d[k][j] < d[i][j]) { d[i][j] = d[i][k] + d[k][j]; } }}bool equal(int x){ for (int i = 1; i <= M; i++) { for (int j = 1; j <= M; j++) { if (mtx[x][i][j] != t[i][j]) return false; } } return true;}int main(){ int a, b; for (; ~scanf("%d%d", &N, &M);) { if (!N && !M) break; init(); for (int i = 1; i <= N; i++) for (int j = 1; j <= M; j++) for (int k = 1; k <= M; k++) scanf("%d", &mtx[i][j][k]); for (int i = 1; i <= N; i++) { for (int j = 1; j <= N; j++) { if (i == j) continue; // 人家题目中说了A,B,C是三个城市,不能指代相同 mul(i, j); // 把矩阵乘法放在第二层进行,不要放到第三层 for (int k = 1; k <= N; k++) { if (k == i || d[i][k] == 1) continue; if (k == j) continue; // 没加这个就 WA,看来里面有单位矩阵(A) // 按照题目规矩来,人家说了A,B,C是三个城市,这就意味着不能指代相同 if (equal(k)) d[i][k] = 1; } } } floyd(); scanf("%d", &Q); for (; Q--;) { scanf("%d%d", &a, &b); if (d[a][b] == INF) printf("Sorry\n"); else printf("%d\n", d[a][b]); } } return 0;}

转载于:https://www.cnblogs.com/CrossingOver/p/10704860.html

你可能感兴趣的文章
脑力风暴之小毛驴历险记(2)---谁敢动我的金币(上).
查看>>
sqlalchemy(一)基本操作
查看>>
eclipse html插件下载和安装
查看>>
[Wc2009]shortest
查看>>
如何让msvsmon.exe 以服务方式运行
查看>>
物理主机win 7系统迁移至VMware ESXI服务器
查看>>
2019春第二周作业
查看>>
房屋租赁协议
查看>>
centos 6.3 搭建git/gitosis/gitweb
查看>>
jq deferred举例
查看>>
BeanUtils工具类,简化数据封装
查看>>
jsp指令
查看>>
【练习---日志恢复】正常关库删除一组当前日志组
查看>>
关于ArcGIS动态图层空间内栅格数据,JS前端显示颜色不正确的解决方案
查看>>
JS正则大全
查看>>
送给自己的九封信
查看>>
Delphi XE中使用dbExpress连接MySQL数据库疑难问题解决
查看>>
java IO流读取图片供前台显示
查看>>
微信小程序改变页面显示setData、修改数组、分页等学习笔记
查看>>
CSS3文本溢出显示省略号
查看>>