poj 3613 分类: poj 2015-04-17 10:37 38人阅读 评论(0) 收藏
2015-04-17 10:37
357 查看
Problem : 问从 S 到 T 经过边得个数恰为k的最短路是多少。
Solution : 做 k 次 Floyd 即可,使用分治[快速幂]思想优化
Solution : 做 k 次 Floyd 即可,使用分治[快速幂]思想优化
#include<map> #include<queue> #include<stack> #include<utility> #include<string> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #include<cmath> #include<iostream> #include<algorithm> #define Mp(x,y) std::make_pair(x,y) const int MAXT = 105,INF = (1<<30)-1,MAXN = 205; int n ,k , T , s , e; struct Matrix { int n, mat[MAXN][MAXN]; }A; struct Edge{int u,v,w;Edge(int u = 0,int v = 0,int w = 0):u(u),v(v),w(w){}}star[MAXT<<1] = {0}; Matrix Floyd(Matrix A,Matrix B) { Matrix C; C.n = A.n; for(int i = 1; i <= C.n; i++) for(int j = 1;j <= C.n; j++) C.mat[i][j] = INF; for(int i = 1; i <= A.n; i++) for(int j = 1; j <= B.n; j++) for(int k = 1; k <= C.n; k++) C.mat[i][j] = std::min(C.mat[i][j],A.mat[i][k] + B.mat[k][j]); return C; } int bowl[MAXT<<1] = {0},blen = 0; Matrix PowerMat(Matrix X,int p) { Matrix ret = X; while(p) { if(p&1)ret = Floyd(ret,X); X = Floyd(X,X), p >>= 1; } return ret; } int main() { #ifndef ONLINE_JUDGE freopen("poj3613.in","r",stdin); freopen("poj3613.out","w",stdout); #endif std::cin >> k >> T >> s >> e; for(int i = 1,a,b,l; i <= T; i++) { std::cin >> l >> a >> b; star[(i<<1)-1] = Edge(a,b,l); star[i<<1] = Edge(b,a,l); bowl[++blen] = a, bowl[++blen] = b; } std::sort(bowl+1,bowl+blen+1); blen = std::unique(bowl+1,bowl+blen+1) - (bowl+1); for(int i = 1; i <= (T<<1); i++) { star[i].u = std::lower_bound(bowl+1,bowl+blen+1,star[i].u) - bowl; star[i].v = std::lower_bound(bowl+1,bowl+blen+1,star[i].v) - bowl; } s = std::lower_bound(bowl+1,bowl+blen+1,s) - bowl; e = std::lower_bound(bowl+1,bowl+blen+1,e) - bowl; A.n = blen; for(int i = 1; i <= A.n; i++) for(int j = 1;j <= A.n; j++) A.mat[i][j] = INF; for(int i = 1 ;i <= (T<<1); i++) if(star[i].w < A.mat[star[i].u][star[i].v]) A.mat[star[i].u][star[i].v] = star[i].w; std::cout << PowerMat(A,k-1).mat[s][e] << std::endl; fprintf(stderr,"%f",clock()*1.0/CLOCKS_PER_SEC); #ifndef ONLINE_JUDGE fclose(stdin); fclose(stdout); #endif return 0; }
相关文章推荐
- poj 3580 分类: poj templates 2015-04-17 08:40 45人阅读 评论(0) 收藏
- poj 2828 分类: poj 2015-03-06 21:49 38人阅读 评论(0) 收藏
- 训练--最短路--01 分类: 最短路 2015-02-05 16:24 38人阅读 评论(0) 收藏
- poj2486 分类: poj 2015-07-20 10:21 12人阅读 评论(0) 收藏
- Ubiquitous Religions 分类: POJ 2015-06-16 17:13 11人阅读 评论(0) 收藏
- poj 3468 分类: poj templates 2015-04-01 20:20 34人阅读 评论(0) 收藏
- 多线程之GCD(一) 分类: ios开发 2015-04-17 17:58 357人阅读 评论(0) 收藏
- Self Numbers 分类: POJ 2015-06-12 20:07 14人阅读 评论(0) 收藏
- 手工编译、运行JavaSE项目,且此项目需要第三方jar包支持,且文件中有打包。 分类: java 2010-03-27 10:37 1057人阅读 评论(0) 收藏
- Crashing Robots 分类: POJ 2015-06-29 11:44 10人阅读 评论(0) 收藏
- poj 3974 分类: poj templates 2015-07-05 22:24 18人阅读 评论(0) 收藏
- poj1155 分类: poj 2015-07-20 10:24 11人阅读 评论(0) 收藏
- linux设置python环境变量 分类: python 2013-05-13 10:37 1253人阅读 评论(0) 收藏
- Doubles 分类: POJ 2015-06-12 18:24 11人阅读 评论(0) 收藏
- sgu143 分类: sgu 2015-03-11 22:11 38人阅读 评论(0) 收藏
- poj 3686 分类: poj templates 2015-03-26 22:29 46人阅读 评论(0) 收藏
- Finding Nemo 分类: POJ 2015-07-11 10:11 10人阅读 评论(0) 收藏
- poj 2443 分类: poj 2015-04-13 19:35 36人阅读 评论(0) 收藏
- Color Me Less 分类: POJ 2015-06-10 18:24 11人阅读 评论(0) 收藏
- Binary Tree 分类: POJ 2015-06-12 20:34 17人阅读 评论(0) 收藏