博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3613 Cow Relays
阅读量:4663 次
发布时间:2019-06-09

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

大意:给定一张M条边的无向带权图,求从起点S到终点E恰好经过K条边的最短路径。2<=M<=100,2<=K<=1000000。保证每个连边的点度至少为2.

思路:参见2008国家集训队论文day1 《矩阵乘法在信息学中的应用》俞华程。

设计一个相似的动态规划的算法:

g[i][j] = ∑g[i-1][k]·G[k][j]

其中g[i][j]表示有多少通过i条边的路径能到达点j。

同样,我们可以重新定义矩阵乘法为:

C[i][j] =  min(A[i][k]·B[k][j]).(1<=k<=b)

其中 · 代表A矩阵和B矩阵进行一次Floyd求min操作。

把给定的图转换为邻接矩阵,如果i->j对应有边则赋值边权,否则赋值为无穷大,C[i][j] = min(A[i][k]·A[k][j]),对应于从i->j经过两条路径的最短路径。同理:我们只需进行K-1次操作即可得到最终的答案矩阵。

View Code
#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;const int maxn = 110;const int INF = 0x3f3f3f3f;map
Map;typedef struct Matrix{ int m[maxn][maxn]; void init() { memset(m, INF, sizeof(m)); }}Ma;int k, n, m, s, e;void init(){ n = 0; Map.clear();}Ma Floyd(Ma A, Ma B){ Ma C; C.init(); for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(C.m[i][j] > A.m[i][k] + B.m[k][j]) C.m[i][j] = A.m[i][k] + B.m[k][j]; } } } return C;}Ma power(Ma A, int k){ if(k == 0) return A; Ma ans = A; while(k) { if(k & 1) { ans = Floyd(ans, A); } A = Floyd(A, A); k /= 2; } return ans;}Ma A;void read_case(){ init(); A.init(); for(int i = 0; i < m; i++) { int x, y, w; scanf("%d%d%d", &w, &x, &y); if(!Map[x]) Map[x] = ++n; if(!Map[y]) Map[y] = ++n; int u = Map[x], v = Map[y]; if(w < A.m[u][v]) { A.m[u][v] = A.m[v][u] = w; } }}void solve(){ read_case(); Ma ans; ans = power(A, k-1); printf("%d\n", ans.m[Map[s]][Map[e]]);}int main(){ while(~scanf("%d%d%d%d", &k, &m, &s, &e)) { solve(); } return 0;}

 

转载于:https://www.cnblogs.com/Buck-Meister/archive/2013/04/24/3039965.html

你可能感兴趣的文章
Android Studio 生成aar包多Module引用问题
查看>>
AOP静态代理解析2-代码织入
查看>>
asp.net2.0导出pdf文件完美解决方案【转载】
查看>>
JavaWeb过滤器.监听器.拦截器-原理&区别(转)
查看>>
CentOS中yum安装ffmpeg
查看>>
2014ACM/ICPC亚洲区北京站题解
查看>>
logrotate命令
查看>>
C语言之字符、整数、数组、字符串笔记
查看>>
将tomcat设置在服务中为开机自动启动
查看>>
c#之使用单例模式实现数据库连接
查看>>
【JUC】JDK1.8源码分析之CopyOnWriteArraySet(七)
查看>>
editplus文本编辑器
查看>>
装饰器和闭包
查看>>
纸片折叠
查看>>
js类型判断:typeof与instanceof
查看>>
实验 8
查看>>
Django学习笔记--数据库中的单表操作----增删改查
查看>>
[洛谷P5075][JSOI2012]分零食
查看>>
第三次作业(第四次不要电梯了吧)
查看>>
mustache语法
查看>>