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 4
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9
Sample Output 10
Source USACO 2007 November Gold

题面

用一个矩阵a(i, j)来表示i到j经过若干条边的最短路,
初始化a为i到j边的长度,没有则是正无穷。
比如a矩阵表示经过n条边,b矩阵表示经过m条边,
那么a * b得到的矩阵表示经过m + n条边,
采用Floyd的思想进行更新。

 #include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<queue>
#include<string>
#include<map>
#define ll long long
using namespace std;
ll n,m,S,T,l;
map<ll,ll>id;
struct node{
ll a[][];
friend node operator *(node x,node y)
{
node z;
memset(z.a,0x3f,sizeof(z.a));
for(ll k=;k<=l;k++)
for(ll i=;i<=l;++i)
for(ll j=;j<=l;++j)
z.a[i][j]=min(z.a[i][j],x.a[i][k]+y.a[k][j]);
return z;
}
}s,ans;
void ksm()
{
ans=s;
n--;
while(n)
{
if(n&) ans=ans*s;
s=s*s;
n>>=;
}
}
int main()
{
freopen("run.in","r",stdin);
freopen("run.out","w",stdout);
memset(s.a,0x3f,sizeof(s.a));
scanf("%lld%lld%lld%lld",&n,&m,&S,&T);
for(ll i=,x,y,z;i<=m;++i)
{
scanf("%lld%lld%lld",&z,&x,&y);
if(id[x]) x=id[x];
else l++,id[x]=l,x=l;
if(id[y]) y=id[y];
else l++,id[y]=l,y=l;
s.a[x][y]=s.a[y][x]=z;
}
S=id[S];T=id[T];
ksm();
printf("%lld",ans.a[S][T]);
return ;
}
/*
2 6 6 4
11 4 6
4 4 8
8 4 9
6 6 8
2 6 9
3 8 9
10
*/

最新文章

  1. Android Material Design 兼容库的使用
  2. VC++ 回调函数及使用方法(转)
  3. Spring3 url匹配规则
  4. Linux 进程间通信(一)
  5. 3种归并操作js代码
  6. 获取API返回值
  7. 【转】cocos2d-x使用第三方的TTF字体库
  8. ECSHOP返回顶部的代码 纯CSS超简单
  9. java程序连接MongoDB副本集测试
  10. Android面试题目2
  11. 【面试问题】——秋招面试中遇到的一些问题&amp;思维导图&amp;反思
  12. Java基本语法(一)
  13. python -- while循环,格式化输出,运算符,初识编码
  14. PythonStudy——字符串、列表、元组、字典、集合 (str、list、tuple、dict、set)常用方法总结
  15. JavaSE学习总结(七)—— 集合
  16. Prometheus的架构及持久化
  17. 双向链表--首页大小不一卡片排序 --- react --- js
  18. Java-动态代理技术
  19. Java基础-SSM之Spring快速入门篇
  20. 编译libevent源代码(Windows)

热门文章

  1. 【工具】Fiddler使用教程
  2. 安卓和IOS抓包工具
  3. 【MM系列】SAP 在SAP中更改基本计量单位
  4. iptables规则
  5. mysql下载与安装过程
  6. xmake入门,构建项目原来可以如此简单
  7. Docker开启ssh服务
  8. Python 入门之 推导式
  9. vscode配置汇总
  10. linux的管道 |和grep命令以及一些其他命令(diff,echo,cat,date,time,wc,which,whereis,gzip,zcat,unzip,sort)