poj 3613Cow Relays
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的思想进行更新。
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 #include<algorithm> 5 #include<cmath> 6 #include<queue> 7 #include<string> 8 #include<map> 9 #define ll long long 10 using namespace std; 11 ll n,m,S,T,l; 12 map<ll,ll>id; 13 struct node{ 14 ll a[202][202]; 15 friend node operator *(node x,node y) 16 { 17 node z; 18 memset(z.a,0x3f,sizeof(z.a)); 19 for(ll k=1;k<=l;k++) 20 for(ll i=1;i<=l;++i) 21 for(ll j=1;j<=l;++j) 22 z.a[i][j]=min(z.a[i][j],x.a[i][k]+y.a[k][j]); 23 return z; 24 } 25 }s,ans; 26 void ksm() 27 { 28 ans=s; 29 n--; 30 while(n) 31 { 32 if(n&1) ans=ans*s; 33 s=s*s; 34 n>>=1; 35 } 36 } 37 int main() 38 { 39 freopen("run.in","r",stdin); 40 freopen("run.out","w",stdout); 41 memset(s.a,0x3f,sizeof(s.a)); 42 scanf("%lld%lld%lld%lld",&n,&m,&S,&T); 43 for(ll i=1,x,y,z;i<=m;++i) 44 { 45 scanf("%lld%lld%lld",&z,&x,&y); 46 if(id[x]) x=id[x]; 47 else l++,id[x]=l,x=l; 48 if(id[y]) y=id[y]; 49 else l++,id[y]=l,y=l; 50 s.a[x][y]=s.a[y][x]=z; 51 } 52 S=id[S];T=id[T]; 53 ksm(); 54 printf("%lld",ans.a[S][T]); 55 return 0; 56 } 57 /* 58 2 6 6 4 59 11 4 6 60 4 4 8 61 8 4 9 62 6 6 8 63 2 6 9 64 3 8 9 65 10 66 */