pku1502 Subway
http://poj.org/problem?id=2502
图论,最短路,dijkstra
交大模板
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #define N 234 5 6 float dis[N], g[N][N]; 7 int n, x[N], y[N]; 8 bool v[N]; 9 const float inf = 12345; 10 11 float min(float x, float y) 12 { 13 return x<y? x: y; 14 } 15 16 void dijkstra() 17 { 18 for(int i=1; i<=n; i++) 19 { 20 dis[i] = inf; 21 } 22 dis[1] = 0; 23 memset(v, 0, sizeof(v)); 24 for(int i=1; i<=n; i++) 25 { 26 int mark = -1; 27 float mindis = inf; 28 for(int j=1; j<=n; j++) 29 { 30 if(!v[j] && dis[j] < mindis) 31 { 32 mindis = dis[j]; 33 mark = j; 34 } 35 } 36 v[mark] = 1; 37 for(int j=1; j<=n; j++) 38 { 39 dis[j] = min(dis[j], dis[mark] + g[mark][j]); 40 } 41 } 42 } 43 44 float d(int i, int j) 45 { 46 return (float)sqrt( (double)(x[i]-x[j])*(x[i]-x[j]) + (double)(y[i]-y[j])*(y[i]-y[j]) ); 47 } 48 49 int main() 50 { 51 int i, j; 52 float temp; 53 for(i=0; i<N; i++) 54 { 55 for(j=0; j<N; j++) 56 { 57 g[i][j] = inf; 58 } 59 } 60 scanf("%d%d%d%d", x+1, y+1, x+2, y+2); 61 g[1][2] = g[2][1] = min(g[1][2], d(1, 2)*0.006); 62 i = 3; 63 while(~scanf("%d%d", x+i, y+i), x[i]+1) 64 { 65 for(j=0; j<i; j++) 66 { 67 g[i][j] = g[j][i] = min(g[i][j], d(i, j)*0.006); 68 } 69 for(i=i+1; scanf("%d%d", x+i, y+i), x[i]+1||y[i]+1; i++) 70 { 71 j = i - 1; 72 g[i][j] = g[j][i] = min(g[i][j], d(i, j)*0.0015); 73 for(j=0; j<i; j++) 74 { 75 g[i][j] = g[j][i] = min(g[i][j], d(i, j)*0.006); 76 } 77 } 78 } 79 n = i - 1; 80 dijkstra(); 81 printf("%.0f\n", dis[2]); 82 return 0; 83 }