poj 3613 Cow Relays(经过N条边的最短路,floyd + 二分矩阵)
来源:互联网 发布:长瓢网络上是什么意思 编辑:程序博客网 时间:2024/06/05 03:04
Description
For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race using the T (2 ≤ T ≤ 100) cow trails throughout the pasture.
Each trail connects two different intersections (1 ≤ I1i ≤ 1,000; 1 ≤ I2i ≤ 1,000), each of which is the termination for at least two trails. The cows know the lengthi of each trail (1 ≤ lengthi ≤ 1,000), the two intersections the trail connects, and they know that no two intersections are directly connected by two different trails. The trails form a structure known mathematically as a graph.
To run the relay, the N cows position themselves at various intersections (some intersections might have more than one cow). They must position themselves properly so that they can hand off the baton cow-by-cow and end up at the proper finishing place.
Write a program to help position the cows. Find the shortest path that connects the starting intersection (S) and the ending intersection (E) and traverses exactly N cow trails.
Input
* Line 1: Four space-separated integers: N, T, S, and E
* Lines 2..T+1: Line i+1 describes trail i with three space-separated integers: lengthi , I1i , and I2i
Output
* Line 1: A single integer that is the shortest distance from intersection S to intersection E that traverses exactly N cow trails.
Sample Input
2 6 6 411 4 64 4 88 4 96 6 82 6 93 8 9
Sample Output
10
题意:给出一个无向图,T条边,给出N,S,E,求S到E经过N条边的最短路径长度。
思路:floyd + 倍增思想。参考http://hi.baidu.com/lxxstar1226/item/9119a40de25c55faa1103462
AC代码:
#include <iostream>#include <cmath>#include <cstdlib>#include <cstring>#include <cstdio>#include <queue>#include <stack>#include <ctime>#include <vector>#include <algorithm>#define ll long long#define L(rt) (rt<<1)#define R(rt) (rt<<1|1)#define eps 1e-6;using namespace std;const int INF = 1e9 + 7;const int maxn = 205;struct Mat{ int mat[maxn][maxn];}A, ans;int hash[1005];int n, t, s, e, cnt;void init(){ for(int i = 0; i < maxn; i++) for(int j = 0; j < maxn; j++) A.mat[i][j] = ans.mat[i][j] = INF; cnt = 0;}Mat floyd(Mat a, Mat b){ Mat tmp; for(int i = 1; i <= cnt; i++) for(int j = 1; j <= cnt; j++) tmp.mat[i][j] = INF; for(int k = 1; k <= cnt; k++) for(int i = 1; i <= cnt; i++) for(int j = 1; j <= cnt; j++) if(tmp.mat[i][j] > a.mat[i][k] + b.mat[k][j]) tmp.mat[i][j] = a.mat[i][k] + b.mat[k][j]; return tmp;}void pow(){ while(n) { if(n & 1) ans = floyd(ans, A); A = floyd(A, A); n >>= 1; }}int main(){ int a, b, c; while(~scanf("%d%d%d%d", &n, &t, &s, &e)) { init(); memset(hash, 0, sizeof(hash)); while(t--) { scanf("%d%d%d", &c, &a, &b); if(!hash[a]) hash[a] = ++cnt; a = hash[a]; if(!hash[b]) hash[b] = ++cnt; b = hash[b]; A.mat[a][b] = A.mat[b][a] = min(A.mat[a][b], c); } for(int i = 1; i <= cnt; i++) ans.mat[i][i] = 0; pow(); printf("%d\n", ans.mat[hash[s]][hash[e]]); } return 0;}
- poj 3613 Cow Relays(经过N条边的最短路,floyd + 二分矩阵)
- POJ 3613 Cow Relays Floyd最短路
- poj3613Cow Relays (经过n条边的最短路)
- poj 3613 Cow Relays (K步最短路+Floyd+矩阵快速幂)
- POJ 3613 Cow Relays k步最短路 (floyd + 矩阵快速幂)
- poj 3613 Cow Relays 经L边的最短路
- POJ 3613 Cow Relays k步最短路 二分优化
- poj 3613(经过N条边的最短路)
- POJ 3613 Cow Relays floyd+矩阵
- POJ 3613 Cow Relays (floyd + 矩阵快速幂)
- POJ 3613 Cow Relays(矩阵模板+快速幂+floyd)
- PKU 3613 Cow Relays (指定路径条数的最短路)
- 【Floyd求最短路+快速幂】PKU-3613-Cow Relays
- POJ-3613-Cow Relays-矩阵
- poj 3613 Cow Relays (floyd+矩阵快速幂+坐标离散化)
- POJ 3613Cow Relays( floyd 倍增法)
- POJ题目3613 Cow Relays(Floyd+快速幂)
- POJ--3613[Cow Relays] floyd 倍增法
- js call
- 从事英文搜刮引擎优化行业所具备的技术
- 最短路-dijkstra
- 【黑马程序员】C#笔记之数值类型
- MIPS:字符串查找比较
- poj 3613 Cow Relays(经过N条边的最短路,floyd + 二分矩阵)
- 最简单下拉刷新,Google最新(可刷新任何控件)
- Android设置铃声分析
- Cocos2d-x简单游戏<打飞机>代码实现|第三部分:引导层
- myeclipse导入工程中文乱码
- [ACM] hdu 1521 排列组合(组合+DFS)
- 用vector(向量)实现动态开辟二维三维数组
- Cocos2d-x简单游戏<打飞机>代码实现|第四部分:主场景<Helloworld.h>
- 一个基于LL(1)的简易C++四则表达式计算