Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 5028 | Accepted: 2001 |
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
题意:给出一个无向图,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; }