pku 1847

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
 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
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
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

你可能感兴趣的:(pku 1847)