Cow Relays
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions:9207   Accepted: 3604

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: NTS, 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 4
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9

Sample Output

10

Source

题意:

在一个图上求从$S$到$E$的,刚好经过$n$条边的最短路径长。

思路:

没想到最短路的题目还可以用快速幂。也没想到快速幂还可以这么写。

这道题边最多是100条,所以可以先把点离散化。离散化后点的编号最大是$node_cnt$

最初的矩阵$G[i,j]$中存储的其实是从$i$经过一条边到达$j$的最短路

那么$G^{(2)}[i, j] = \min_{1\leq k\leq node_cnt}{G[i, k] + G[k, j]}$就可以表示从$i$经过两条边到达$j$的最短路

如果矩阵$G^{(m)}$表示任意两点之间恰好经过$m$条边的最短路,那么

$G^{(r+m)}[i, j] = \min_{1\leq k\leq node_cnt}{G^{(r)}[i, k] + G^{(m)}[k, j]}$

这就可以使用快速幂进行递推了。只需要把$matrix$的乘法操作中,$+=$变成$\min$, $*$变成$+$

注意矩阵要初始化为$+\infty$

 #include<iostream>
//#include<bits/stdc++.h>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<climits>
#include<map>
using namespace std;
typedef long long LL;
#define N 100010
#define pi 3.1415926535
#define inf 0x3f3f3f3f int n, t, S, E;
const int maxn = ;
int node_cnt;
struct matrix{
int m[maxn][maxn];
//int m_size;
matrix operator *(const matrix &b)const{
matrix ret;
memset(ret.m, 0x3f, sizeof(ret.m));
for(int i = ; i <= node_cnt; i++){
for(int j = ; j <= node_cnt; j++){
//ret.m[i][j] = inf;
for(int k = ; k <= node_cnt; k++){
ret.m[i][j] = min(m[i][k] + b.m[k][j], ret.m[i][j]);
}
}
}
return ret;
}
}g;
//int g[maxn][maxn];
struct edge{
int u, v, length;
}e[];
set<int>nodes;
set<int>::iterator set_it;
map<int, int>node_mp; matrix ksm(matrix a, int x)
{
matrix ret, k;
k = a;
ret = a;
x--;
while(x){
if(x & ){
ret = ret * k;
}
x >>= ;
k = k * k;
}
return ret;
} int main()
{
while(scanf("%d%d%d%d", &n, &t, &S, &E) != EOF){
for(int i = ; i < t; i++){
scanf("%d%d%d", &e[i].length, &e[i].u, &e[i].v);
nodes.insert(e[i].u);
nodes.insert(e[i].v);
} node_cnt = ;
for(set_it = nodes.begin(); set_it != nodes.end(); set_it++){
node_mp[*set_it] = ++node_cnt;
}
//g.m_size = node_cnt;
memset(g.m, 0x3f, sizeof(g.m));
for(int i = ; i < t; i++){
int u = e[i].u, v = e[i].v;
g.m[node_mp[u]][node_mp[v]] = e[i].length;
g.m[node_mp[v]][node_mp[u]] = e[i].length;
}
/*for(int i = 1; i <= node_cnt; i++){
for(int j = 1; j <= node_cnt; j++){
cout<<g.m[i][j]<<" ";
}
cout<<endl;
}*/ matrix ans = ksm(g, n);
//cout<<node_mp[S]<<" "<<node_mp[E]<<endl;
printf("%d\n", ans.m[node_mp[S]][node_mp[E]]);
}
return ;
}

poj3613 Cow Relays【好题】【最短路】【快速幂】的更多相关文章

  1. Cow Relays POJ - 3613 (floyd+快速幂)

    For their physical fitness program, N (2 ≤ N ≤ 1,000,000) cows have decided to run a relay race usin ...

  2. POJ3613 Cow Relays(矩阵快速幂)

    题目大概要求从起点到终点恰好经过k条边的最短路. 离散数学告诉我们邻接矩阵的k次幂就能得出恰好经过k条路的信息,比如POJ2778. 这题也一样,矩阵的幂运算定义成min,而min满足结合律,所以可以 ...

  3. [POJ3613] Cow Relays(Floyd+矩阵快速幂)

    解题报告 感觉这道题gyz大佬以前好像讲过一道差不多的?然鹅我这个蒟蒻发现矩阵快速幂已经全被我还给老师了...又恶补了一遍,真是恶臭啊. 题意 给定一个T(2 <= T <= 100)条边 ...

  4. POJ3613 Cow Relays [矩阵乘法 floyd类似]

    Cow Relays Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7335   Accepted: 2878 Descri ...

  5. 疯子的算法总结(九) 图论中的矩阵应用 Part 1+POJ3613 Cow Relays

    图的存储有邻接矩阵,那么他就具备一些矩阵的性质,设有一个图的demo[100][100];那么demo[M][N]就是M—>N的距离,若经过一次松弛操作demo[M][N]=demo[M][K] ...

  6. 【POJ3613 Cow Relays】(广义矩阵乘法)

    题目链接 先离散化,假设有\(P\)个点 定义矩阵\(A_{ij}\)表示\(i\)到\(j\)只经过一条边的最短路,\[{(A^{a+b})_{ij}=\min_{1\le k\le p} \{ ( ...

  7. [POJ3613] Cow Relays

    link 题目大意 给你一个含有边权的无向图,问从$S$到$T$经过$N$条边的最小花费. 试题分析 我们可以很容易推导$dp$方程,$dp(k,i,j)$表示经过$k$条边从$i$到$j$的最小花费 ...

  8. (中等) CF 576D Flights for Regular Customers (#319 Div1 D题),矩阵快速幂。

    In the country there are exactly n cities numbered with positive integers from 1 to n. In each city ...

  9. E题:Water Problem(快速幂模板)

    题目大意:原题链接  题解链接 解题思路:令x=x-1代入原等式得到新的等式,两式相加,将sin()部分抵消掉,得到只含有f(x)的状态转移方程f(x+1)=f(x)+f(x-2)+f(x-3),然后 ...

随机推荐

  1. InfluxDB源码目录结构解析

    操作系统 : CentOS7.3.1611_x64 go语言版本:1.8.3 linux/amd64 InfluxDB版本:1.1.0 influxdata主目录结构 [root@localhost ...

  2. SNF快速开发平台WinForm-CS甘特图

    我们在做项目当中会经常用到按时间进度查看任务,其通过条状图来显示项目,进度,和其他时间相关的系统进展的内在关系随着时间进展的情况. 甘特图包含以下三个含义: 1.以图形或表格的形式显示活动: 2.通用 ...

  3. MongoDB 聚合操作(转)

    在MongoDB中,有两种方式计算聚合:Pipeline 和 MapReduce.Pipeline查询速度快于MapReduce,但是MapReduce的强大之处在于能够在多台Server上并行执行复 ...

  4. Atitit 数据融合merge功能v3新特性.docx

    Atitit 数据融合merge功能v3新特性.docx 1.1. 版本历史1 1.2. 生成sql结果1 1.3. 使用范例1 1.4. 核心代码1 1.1. 版本历史 V2增加了replace部分 ...

  5. 菜鸟要做架构师(二)——java性能优化之for循环

    完成同样的功能,用不同的代码来实现,性能上可能会有比较大的差别,所以对于一些性能敏感的模块来说,对代码进行一定的优化还是很有必要的.今天就来说一下java代码优化的事情,今天主要聊一下对于for(wh ...

  6. 基于jQuery+HTML5加入购物车代码

    基于jQuery+HTML5加入购物车代码.这是一款基于jquery+html5实现的支持累加计价的网站购物车代码.效果图如下: 在线预览   源码下载 实现的代码. html代码: <div ...

  7. PSR PHP业界规范

    0x0 大型项目的问题 随着项目越来越大,参与的人数越来越多,代码变得越来越不可维护了. 每个人都给项目带来自己的风格,所以这时就需要大家采用一个统一的标准. 0x1 解决办法 于是顶尖的PHPer们 ...

  8. 【iCore4 双核心板_ARM】例程十三:SDIO实验——读取SD卡信息

    实验现象: 核心代码: int main(void) { system_clock.initialize(); led.initialize(); usart6.initialize(); usart ...

  9. Git 修正错误

    大部分的人都会犯错.所以每VCS提供了一个功能,修正错误,直到特定的点. Git提供功能使用,我们可以撤销已作出的修改到本地资源库. 假设用户不小心做了一些更改,以他的本地的仓库,现在他要扔掉这些变化 ...

  10. Java知多少(86)文本框和文本区的输入输出

    在GUI中,常用文本框和文本区实现数据的输入和输出.如果采用文本区输入,通常另设一个数据输入完成按钮.当数据输入结束时,点击这个按钮.事件处理程序利用getText()方法从文本区中读取字符串信息.对 ...