博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷P2886牛继电器
阅读量:5094 次
发布时间:2019-06-13

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

倍增 $ Floyd $

注意结构体里二维数组不能开到 $ 2000 $

#include 
#include
#include
#include
#define Re register using namespace std;inline int read(){ char ch = getchar(); int f = 1 , x = 0; while(ch > '9' || ch < '0') {if(ch == '-' ) f = -1 ; ch = getchar();} while(ch >= '0' && ch <= '9') {x = (x << 1) + (x << 3) + ch - '0' ; ch = getchar();} return x * f;}long long n,tot,m,s,t,x,y,z;long long vis[20050],cnt;long long w[2050][2050];struct node{ long long f[205][205]; node() { memset(f , 0x3f , sizeof(f)) ; }}ans ;node mul(node a , node b) { node res ; for(Re int k = 1 ; k <= tot ; ++k) for(Re int i = 1 ; i <= tot ; ++i) for(Re int j = 1 ; j <= tot ; ++j) if(res.f[i][j] > a.f[i][k] + b.f[k][j]) res.f[i][j] = a.f[i][k] + b.f[k][j]; return res;}inline long long quick_power(long long k){ node res ; for(Re int i = 1 ; i <= tot ; ++i) res.f[i][i] = 0; while(k) { if(k & 1) res = mul(res , ans); ans = mul(ans , ans ) ; k >>= 1; } return res.f[vis[s]][vis[t]] ;}int main(){ n = read(); m = read(); s = read(); t = read(); for(Re int i = 1 ; i <= m ; ++i) { z = read() ; x = read() ; y = read() ; if(!vis[x]) vis[x] = ++tot; if(!vis[y]) vis[y] = ++tot; ans.f[vis[x]][vis[y]] = ans.f[vis[y]][vis[x]] = min(ans.f[vis[x]][vis[y]] , z) ; } printf("%lld\n" , quick_power(n)); return 0;}

转载于:https://www.cnblogs.com/Stephen-F/p/9929616.html

你可能感兴趣的文章
基本封装方法
查看>>
生活大爆炸之何为光速
查看>>
[Typescript] Specify Exact Values with TypeScript’s Literal Types
查看>>
Illustrated C#学习笔记(一)
查看>>
理解oracle中连接和会话
查看>>
Scrapy实战篇(三)之爬取豆瓣电影短评
查看>>
HDU 5510 Bazinga KMP
查看>>
[13年迁移]Firefox下margin-top问题
查看>>
Zookeeper常用命令 (转)
查看>>
Enterprise Library - Data Access Application Block 6.0.1304
查看>>
重构代码 —— 函数即变量(Replace temp with Query)
查看>>
Bootstrap栅格学习
查看>>
程序员的数学
查看>>
聚合与组合
查看>>
洛谷 P2089 烤鸡【DFS递归/10重枚举】
查看>>
我眼中的技术地图
查看>>
lc 145. Binary Tree Postorder Traversal
查看>>
在centos上开关tomcat
查看>>
无人值守安装linux系统
查看>>
黑马程序员——2 注释
查看>>