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 }

 

posted @ 2013-05-25 13:26  Yuan1991  阅读(116)  评论(0编辑  收藏  举报