博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LUOGU] P2886 [USACO07NOV]牛继电器Cow Relays
阅读量:7125 次
发布时间:2019-06-28

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

 

给定无向连通图,求经过k条边,s到t的最短路

 

Floyd形式的矩阵乘法,同样满足结合律,所以可以进行快速幂。

 

离散化大可不必sort+unique,因为我们甚至并不在乎相对大小,只是要一个唯一编号,可以开一个桶记录

 

之所以进行k-1次快速幂,是因为邻接矩阵本身就走了一步了。

 

#include
#include
#include
using namespace std;const int MAXN=256;int k,m,s,t;int a[MAXN][MAXN];int id[MAXN<<5],tot;struct Mat{ int data[MAXN][MAXN]; Mat(int x=0){memset(data,x,sizeof(data));} Mat operator*(const Mat &rhs){ Mat ret(0x3f); for(int k=1;k<=tot;k++) for(int i=1;i<=tot;i++) for(int j=1;j<=tot;j++) ret.data[i][j]=min(ret.data[i][j],data[i][k]+rhs.data[k][j]); return ret; } Mat operator^(int x){ Mat ret;memcpy(ret.data,a,sizeof(a)); for(Mat base=*this;x;x>>=1){ if(x&1) ret=ret*base; base=base*base; } return ret; }};int main(){ memset(a,0x3f,sizeof(a));// cin>>k>>m>>s>>t; for(int i=1;i<=m;i++){ int x,y,w; cin>>w>>x>>y; if(!id[x])id[x]=++tot; if(!id[y])id[y]=++tot; x=id[x];y=id[y]; a[x][y]=a[y][x]=w; } s=id[s];t=id[t]; Mat e; memcpy(e.data,a,sizeof(a)); e=e^(k-1); cout<

 

转载于:https://www.cnblogs.com/ghostcai/p/9248687.html

你可能感兴趣的文章
DDD~DDD从零起步架构说明
查看>>
HDU 2186 悼念512汶川大地震遇难同胞——一定要记住我爱你
查看>>
Deep Learning(深度学习)学习笔记整理系列之(五)
查看>>
Codeforces 626B Cards(模拟+规律)
查看>>
ExtJS 2.0入门指南
查看>>
(转)深度学习前沿算法思想
查看>>
制作Wi-Fi Ducky远程HID攻击设备
查看>>
前端MVC学习总结(一)——MVC概要与angular概要、模板与数据绑定
查看>>
Fiddler抓包5-接口测试(Composer)
查看>>
iOS - UIDatePicker
查看>>
创建 macvlan 网络 - 每天5分钟玩转 Docker 容器技术(55)
查看>>
Android实现自定义的相机
查看>>
Python - 升级pip
查看>>
收集统计信息的SQL脚本(sosi.sql)--崔华大师
查看>>
MongoDB初探第二篇
查看>>
【ERROR】非DBA用户要使用autotrace功能,报错(SP2-0618:和SP2-0611:和ORA-01919)
查看>>
不良SQL的来源
查看>>
LINUX下C-C++类软件的诊断
查看>>
Sql Server函数全解<四>日期和时间函数
查看>>
Elasticsearch: 权威指南 &#187; 深入搜索 &#187; 多字段搜索 &#187; 多数字段 good
查看>>