pku 2253
2009年7月29日 星期三
題目鏈接:PKU 2253 Frogger
分類:Dijkastra變種
題目分析與算法原型
其實這題和PKU 1797很像,Dijkastra中將判斷語句改成dis[j]=Mini(dis[j],Max(dis[u],map[u][j]))就行了,剛好和1797相反.........(PS:做了N多的最短路徑問題,從明天開始要換口味了,繼續學習圖論的其他經典算法)
Code:
1
#include<stdio.h>
2
#include<math.h>
3
#define len 205
4
#define max 1000000000
5
6
double pos[len][2],dis[len];
7
int visit[len],n;
8
9
double cal(int a,int b)
10

{
11
double res;
12
res=sqrt((pos[a][0]-pos[b][0])*(pos[a][0]-pos[b][0])+(pos[a][1]-pos[b][1])*(pos[a][1]-pos[b][1]));
13
return res;
14
}
15
double Max(double a,double b)
16

{
17
return a > b ? a : b;
18
}
19
void Dijkastra(int s, int v)//s為源點,v為終點(若有的話)
20

{
21
int i,j;
22
for(i=1;i<=n;i++)
23
{
24
dis[i]=cal(s,i);
25
visit[i]=0;
26
}
27
visit[s]=1;
28
for(i=1;i<n;i++)
29
{
30
double min=max;
31
int u;
32
for(j=1;j<=n;j++)
33
if(visit[j]==0&&dis[j]<min)
34
{
35
u=j;
36
min=dis[j];
37
}
38
39
if(min==max)return;//此語句對于非連通圖是必須的,表示當前已經不存在路徑了
40
if(u==v)return ;//若題目是求從給定某個點到另一個給定的點之間的最短路徑時,加上這句節時
41
visit[u]=1;
42
for(j=1;j<=n;j++)
43
if(visit[j]==0)
44
{
45
double k=cal(u,j);
46
if(Max(dis[u],k)<dis[j])
47
dis[j]=Max(dis[u],k);
48
}
49
}
50
}
51
int main()
52

{
53
int i,ccase=1;;
54
while(scanf("%d",&n)!=EOF&&n)
55
{
56
for(i=1;i<=n;i++)scanf("%lf%lf",&pos[i][0],&pos[i][1]);
57
Dijkastra(1,2);
58
printf("Scenario #%d\n",ccase++);
59
printf("Frog Distance = %.3lf\n\n",dis[2]);
60
61
}
62
return 1;
63
}
64
題目鏈接:PKU 2253 Frogger
分類:Dijkastra變種
題目分析與算法原型
其實這題和PKU 1797很像,Dijkastra中將判斷語句改成dis[j]=Mini(dis[j],Max(dis[u],map[u][j]))就行了,剛好和1797相反.........(PS:做了N多的最短路徑問題,從明天開始要換口味了,繼續學習圖論的其他經典算法)
Code:
1

2

3

4

5

6

7

8

9

10



11

12

13

14

15

16



17

18

19

20



21

22

23



24

25

26

27

28

29



30

31

32

33

34



35

36

37

38

39

40

41

42

43

44



45

46

47

48

49

50

51

52



53

54

55



56

57

58

59

60

61

62

63

64
