pku 1847
2009年7月24日
題目鏈接:PKU 1847 Tram
分類:最短路
題目分析與算法原型
將需要搬動的開關的節點的權值設為1,不需要搬動的開關設為0,不可達的設為一個充分大的數,這樣一來,此題就轉換為最短路徑問題了,3種方法(Dijkastra,Floyd以及Bellman-Ford)都可以解決
Code1: (Floyd)
1
#include<stdio.h>
2
#define Len 105
3
#define max 99999999
4
5
int a[Len][Len],i,j,k,n,A,B,t;
6
7
void init()
8

{
9
for(i=1;i<=n;i++)
10
for(j=1;j<=n;j++)
11
{
12
if(i==j)a[i][j]=0;
13
else a[i][j]=max;
14
}
15
}
16
int main()
17

{
18
scanf("%d%d%d",&n,&A,&B);
19
init();
20
for(i=1;i<=n;i++)
21
{
22
scanf("%d",&k);
23
for(j=1;j<=k;j++)
24
{
25
scanf("%d",&t);
26
if(j==1)a[i][t]=0;
27
else a[i][t]=1;
28
}
29
}
30
for(k=1;k<=n;k++)
31
for(i=1;i<=n;i++)
32
for(j=1;j<=n;j++)
33
if(a[i][k]+a[k][j]<a[i][j])a[i][j]=a[i][k]+a[k][j];
34
35
if(a[A][B]==max)printf("-1\n");
36
else printf("%d\n",a[A][B]);
37
return 0;
38
}
39
40
題目鏈接:PKU 1847 Tram
分類:最短路
題目分析與算法原型
將需要搬動的開關的節點的權值設為1,不需要搬動的開關設為0,不可達的設為一個充分大的數,這樣一來,此題就轉換為最短路徑問題了,3種方法(Dijkastra,Floyd以及Bellman-Ford)都可以解決
Code1: (Floyd)
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

Code2: (Dijkastra)
1
#include<stdio.h>
2
#include<string.h>
3
#define Len 105
4
#define max 99999999
5
int a[Len][Len],i,j,k,n,A,B,t,flag[Len],dis[Len],min,u;
6
void init()
7

{
8
for(i=1;i<=n;i++)
9
for(j=1;j<=n;j++)
10
{
11
if(i==j)a[i][j]=0;
12
else a[i][j]=max;
13
}
14
}
15
void Dij()
16

{
17
for(i=1;i<=n;i++)dis[i]=a[A][i];
18
flag[A]=1;
19
for(i=1;i<n;i++)
20
{
21
min=max;
22
for(j=1;j<=n;j++)
23
if(flag[j]==0&&dis[j]<min)
24
{
25
u=j;
26
min=dis[j];
27
}
28
if(min==max)return;
29
30
flag[u]=1;
31
for(j=1;j<=n;j++)
32
if(flag[j]==0&&a[u][j]<max&&dis[u]+a[u][j]<dis[j])
33
dis[j]=dis[u]+a[u][j];
34
}
35
}
36
int main()
37

{
38
scanf("%d%d%d",&n,&A,&B);
39
init();
40
memset(flag,0,sizeof(flag));
41
for(i=1;i<=n;i++)
42
{
43
scanf("%d",&k);
44
for(j=1;j<=k;j++)
45
{
46
scanf("%d",&t);
47
if(j==1)a[i][t]=0;
48
else a[i][t]=1;
49
}
50
}
51
Dij();
52
if(dis[B]==max)printf("-1\n");
53
else printf("%d\n",dis[B]);
54
return 0;
55
}
56
57
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

Code3:(Bellman-Ford)
1
#include<stdio.h>
2
#define Len 105
3
#define max 99999999
4
5
int a[Len][Len],k,n,A,B,t,dis[Len];
6
7
void init()
8

{
9
int i,j;
10
for(i=1;i<=n;i++)
11
for(j=1;j<=n;j++)
12
{
13
if(i==j)a[i][j]=0;
14
else a[i][j]=max;
15
}
16
}
17
18
void bellman_ford()
19

{
20
int queue[Len*100]=
{0},pos=0,fp=0,i;
21
queue[pos++]=A;
22
queue[pos++]=n+1;
23
for(i=1;i<=n;i++)dis[i]=max;
24
dis[A]=0;
25
int N=1;
26
while(queue[fp])
27
{
28
int u;
29
while((u=queue[fp++])==n+1)
30
{
31
if(N++>n+1)return ;
32
queue[pos++]=n+1;
33
}
34
for(i=1;i<=n;i++)
35
{
36
if(i!=u&&a[u][i] < max)
37
{
38
if(dis[i]>dis[u]+a[u][i])
39
{
40
dis[i]=dis[u]+a[u][i];
41
queue[pos++]=i;
42
}
43
}
44
}
45
}
46
}
47
48
int main()
49

{
50
scanf("%d%d%d",&n,&A,&B);
51
init();
52
int i,j;
53
for(i=1;i<=n;i++)
54
{
55
scanf("%d",&k);
56
for(j=1;j<=k;j++)
57
{
58
scanf("%d",&t);
59
if(j==1)a[i][t]=0;
60
else a[i][t]=1;
61
}
62
}
63
bellman_ford();
64
if(dis[B]==max)printf("-1\n");
65
else printf("%d\n",dis[B]);
66
return 0;
67
}
68
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

65

66

67

68

Code4:(Bellman-Ford)
1
#include<stdio.h>
2
#define Len 105
3
#define max 99999999
4
5
int a[Len][Len],i,j,k,n,A,B,t,dis[Len];
6
7
void init()
8

{
9
for(i=1;i<=n;i++)
10
for(j=1;j<=n;j++)
11
{
12
if(i==j)a[i][j]=0;
13
else a[i][j]=max;
14
}
15
}
16
17
void bellman_ford()
18

{
19
int i,j,k;
20
for(i=1;i<=n;i++)dis[i]=max;
21
dis[A]=0;
22
for(i=1;i<n;i++)
23
{
24
for(j=1;j<=n;j++)
25
for(k=1;k<=n;k++)
26
{
27
if(j==k)continue;
28
if(dis[k]>dis[j]+a[j][k])
29
dis[k]=dis[j]+a[j][k];
30
}
31
}
32
}
33
34
int main()
35

{
36
scanf("%d%d%d",&n,&A,&B);
37
init();
38
for(i=1;i<=n;i++)
39
{
40
scanf("%d",&k);
41
for(j=1;j<=k;j++)
42
{
43
scanf("%d",&t);
44
if(j==1)a[i][t]=0;
45
else a[i][t]=1;
46
}
47
}
48
bellman_ford();
49
if(dis[B]==max)printf("-1\n");
50
else printf("%d\n",dis[B]);
51
return 0;
52
}
53
54
55
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
