疯子的算法总结(九) 图论中的矩阵应用 Part 1 POJ3613 Cow Relays
图的存储有邻接矩阵,那么他就具备一些矩阵的性质,设有一个图的demo[100][100];那么demo[M][N]就是M—>N的距离,若经过一次松弛操作demo[M][N]=demo[M][K]+demo[K][N],即为demo[M][N]经过了两条条边的最小距离,floyd是 demo[M][N]=Min(demo[M][K]+demo[K][N],demo[M][N]),有可能两点之间直接距离最短,不经过第三边,那我们不考虑不经过两点之间的情况,那么demo[M][N]等于 demo[M][K]+demo[K][N] 枚举K的最小值,于是出现了一类问题,叫做两点之间经过N条边的最短距离,那么类比矩阵乘法,矩阵乘法是求和,我们在这里是求最小值,那么可以改造矩阵乘法得出,不是Floyd,K放在外面和里面没有区别,放外面像是Floyd,放里面就是标准的矩阵乘法,因为这个只用一次,所有对于枚举的状态是等价的。
for(int k=1; k<=cnt; k++){for(int i=1; i<=cnt; i++){for(int j=1; j<=cnt; j++){c[i][j]=Min(a[i][k]+b[k][j],c[i][j]);}}}
每做一次类矩阵乘法,就代表将M,N松弛后多一条经过边,那么经过T次松弛后就会得到N,M经过T条边的最短距离,既然是类矩阵乘法,是不是遵循结合律呢?答案是的。对于矩阵,前面是经过T条边的最小值,后边是经过W条边的最小值,想乘代表经过了T+W条边的最小值,因为每进行一次都是插入一个点,即使点重复,那么他也会有环形出现,但还是经过了T+W条边,如此,我们可以利用矩阵快速幂求解其经过N条边之后的最小值,那么我们会发现矩阵跟图的是密不可分,一定还会有其他的特点去等待发现,它还可以用于求解图的生成树问题,下次更新。
本思想可以解决POJ3613,好像现在题没了,给一个网站https://www.acwing.com/problem/content/347/,代码附在下方。
#include<iostream>
#include<queue>
#include<algorithm>
#include<set>
#include<cmath>
#include<vector>
#include<map>
#include<stack>
#include<bitset>
#include<cstdio>
#include<cstring>
#define Swap(a,b) a^=b^=a^=b
#define cini(n) scanf("%d",&n)
#define cinl(n) scanf("%lld",&n)
#define cinc(n) scanf("%c",&n)
#define cins(s) scanf("%s",s)
#define coui(n) printf("%d",n)
#define couc(n) printf("%c",n)
#define coul(n) printf("%lld",n)
#define speed ios_base::sync_with_stdio(0)
#define Max(a,b) a>b?a:b
#define Min(a,b) a<b?a:b
#define mem(n,x) memset(n,x,sizeof(n))
#define INF 0x3f3f3f3f
#define maxn 100010
#define esp 1e-9
#define mp(a,b) make_pair(a,b)
using namespace std;
const int N=300;
#define clr(a) memset(a,0,sizeof(a))
int a[N][N],temp[N][N],ans[N][N];
int used[10*N];
int p[10*N];
void floyed(int a[][N],int b[][N],int c[][N],int cnt)
{for(int k=1; k<=cnt; k++){for(int i=1; i<=cnt; i++){for(int j=1; j<=cnt; j++){c[i][j]=Min(a[i][k]+b[k][j],c[i][j]);}}}
}
void copy(int n,int a[][N],int b[][N])
{for(int i=0; i<=n; i++)for(int j=0; j<=n; j++)a[i][j]=b[i][j],b[i][j]=INF;
}
int solve(int s,int t,int n,int cnt)
{while(n){if(n&1){floyed(ans,a,temp,cnt);copy(cnt,ans,temp);}floyed(a,a,temp,cnt);copy(cnt,a,temp);n>>=1;}return ans[s][t];
}
int main()
{int n,t,S,E;scanf("%d%d%d%d",&n,&t,&S,&E);int u,v,w;int cnt=0;mem(ans,0x3f);mem(temp,0x3f);mem(a,0x3f);for(int i=0; i<t; i++){scanf("%d%d%d",&w,&u,&v);if(!used[u]){used[u]=1;p[u]=++cnt;a[cnt][cnt]=temp[cnt][cnt]=ans[cnt][cnt]=0;}if(!used[v]){used[v]=1;p[v]=++cnt;a[cnt][cnt]=temp[cnt][cnt]=ans[cnt][cnt]=0;}a[p[u]][p[v]]=a[p[v]][p[u]]=w;}printf("%d\n",solve(p[S],p[E],n,cnt));return 0;
}
这个题的边不连续,要先离散化。
疯子的算法总结(九) 图论中的矩阵应用 Part 1 POJ3613 Cow Relays相关推荐
- 疯子的算法总结(九) 图论中的矩阵应用 Part 2 矩阵树 基尔霍夫矩阵定理 生成树计数 Matrix-Tree
定理: 1.设G为无向图,设矩阵D为图G的度矩阵,设C为图G的邻接矩阵. 2.对于矩阵D,D[i][j]当 i!=j 时,是一条边,对于一条边而言无度可言为0,当i==j时表示一点,代表点i的度. 即 ...
- 低秩矩阵补全算法matlab实现,推荐系统中的矩阵补全算法
最基本的问题,以用户电影评分为例,也就是这个用户-电影矩阵. 表中是用户多电影的评分,但评分有缺失,因为用户不可能对所有电影作出评价. 那么推荐问题就是给用户合理推荐一个没看过的电影,合理是指,预测用 ...
- 拉普拉斯算子属于卷积方法吗_二维图像中的Laplace算子和图论中的Laplacian矩阵...
最近在阅读 如何理解 Graph Convolutional Network(GCN)?www.zhihu.com 接触到了图论中的Laplacian矩阵,定义为 , 是Laplacian矩阵, 是 ...
- 如何计算图论中的模块化modularity指标,图论中的社区检测算法——Louvain community
图论中的社区检测算法--Louvain community 前言 模块化指标介绍 数学定义 Matlab代码实现 使用实例 community_louvain函数 参考文献 前言 在过去的十年中,人们 ...
- 算法--背包九讲(详细讲解+代码)
背包九讲 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 ...
- 鲍尔.爱迪斯生前在图论中未完成的问题
鲍尔.爱迪斯生前在图论中未完成的问题 F.R.K.淳(F.R.K.Chung) 盘西维尼亚大学数学系 (Department of Mathematics, University of Pennsyl ...
- 算法基础14 —— 图论入门之弗洛伊德算法(Floyed + Dijkstra + Bellman-Ford + SPFA)
入门概念 带权图:如下图所示,我们把边带有权值的图称为带权图 可以将边的权值理解为两点之间的距离 一张图中任意两点间会有不同的路径相连 最短路径:最短路径就是指连接两点的这些路径中最短的一条 Floy ...
- 09_JavaScript数据结构与算法(九)字典
JavaScript 数据结构与算法(九)字典 字典 字典特点 字典存储的是键值对,主要特点是一一对应. 比如保存一个人的信息 数组形式:[19,"Tom", 1.65],可通过下 ...
- 机器学习算法(九): 基于线性判别LDA模型的分类(基于LDA手写数字分类实践)
机器学习算法(九): 基于线性判别模型的分类 1.前言:LDA算法简介和应用 1.1.算法简介 线性判别模型(LDA)在模式识别领域(比如人脸识别等图形图像识别领域)中有非常广泛的应用.LDA是一种监 ...
最新文章
- selenium+Headless Chrome实现不弹出浏览器自动化登录
- 【JDBC】实现对JDBC 连接的简单封装
- cam db num
- java利用正则截取字符串中的数字
- [LeetCode] 169. Majority Element 多数元素
- windows开启smnp服务
- html载入图片代码,TextVeiw加载HTML代码块内图片
- .net Thrift 之旅 (二) TServer
- 局域网内抢带宽的工具 破解版 【PSP流量限制软件】
- 预科阶段:快速实战入门
- 异步加载loading
- 组装机架式服务器,第35讲 组装一台2U机架式服务器演示(2)
- 使用oracle函数 LISTAGG 函数报错。ORA-00923: 未找到要求的 FROM 关键字
- android可用视频地址,「Android」一款可以获取国内各大视频网站直接播放地址的应用...
- 面试题测试APP汇总:快快来收藏起来背背吧
- ONLYOFFICE与O2OA参加西部教育博览会圆满成功
- 双目立体视觉空间坐标精度分析
- 免费、开源、100页开发学习手册,学习GD32不可或缺的利器
- 资讯精选|OfO和北京经信委联合开发出了全国首个电子围栏技术并在北京通州试点
- 数字孪生石油管理平台的能力介绍
热门文章
- install ADT plugin
- [20180808]exists and not exists.txt
- Vert.x入坑须知(2)
- 《Python参考手册(第4版•修订版)》——1.4 文件输入和输出
- 关于HTML、js加密、混淆、源码保护、代码安全,防止解压直接看源码
- Linux MYSQL 数据库
- 【Unity】12.4 通过网格分层选择行进路线
- Python二维码生成库qrcode示例
- [Java][JavaScript]字符串数组与字符串之间的互转(join/split)(转)
- (全部)2008重磅出击——微软Windows Server 2008实战攻略系列