题目大意: 给出一张无向连通图,求S到E经过k条边的最短路。
Time Limit: 1000MS | Memory Limit: 65536KB | 64bit IO Format: %lld & %llu |
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
FLOYD的快速幂~~~~~~~~
HPPAY AC ^-^
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN (200+5)
#define INF 0x3f3f3f3f
#define pb push_back
#define Set(a, v) memset(a, v, sizeof(a))
#define For(i, a, b) for(int i = (a); i <= (int)(b); i++)
int n;
struct Floyd{
int a[MAXN][MAXN];
Floyd(){
Set(a, INF);
}
Floyd operator*(Floyd t){
Floyd ret;
For(k, 1, n)
For(i, 1, n)
For(j, 1, n) ret.a[i][j] = min(ret.a[i][j], a[i][k]+t.a[k][j]);
return ret;
}
};
Floyd mat;
int mp, ms[20001];
int ID(int x){
if(!ms[x]) return ms[x] = ++mp;
return ms[x];
}
void Base(int T){
Floyd A = mat, B;
For(i, 1, n) B.a[i][i] = 0;
while(T){
if(T&1) B = B*A;
A = A*A;
T >>= 1;
}
mat = B;
}
int main(){
freopen("test.in", "r", stdin);
freopen("test.out", "w", stdout);
int N, m, s, e;
scanf("%d%d%d%d", &N, &m, &s, &e);
For(i, 1, m){
int w, u, v;
scanf("%d%d%d", &w, &u, &v);
u = ID(u), v = ID(v);
mat.a[u][v] = mat.a[v][u] = w;
}
n = mp;
Base(N);
printf("%d\n", mat.a[ms[s]][ms[e]]);
return 0;
}