• 去北京看奥运


     去北京看奥运

    Time Limit: 1 Sec  Memory Limit: 64 MB
    Submit: 1080  Solved: 506

    Description

    2008年将到,王飞同学化了九牛二虎之力搞到了2张2008年奥运会足球赛决赛的门票。真是开心啊!他爸爸准备开车跟他一起去北京看球赛。不过门票费好贵啊,所以他爸爸说了,这个钱要在下学期的生活费里扣(好抠门),不过如果他能让从杭州去北京的油费最省(油价最近涨的好厉害啊),那么就不扣生活费了。哈哈,这个就难不倒他了。在ACM里可不是白混的。很快他算出了汽车从杭州到北京必须要加几次油,并查出了到北京要经过哪几个城市,每个城市有哪些加油站以及从某城市各加油站到另一城市各加油站的距离和路况算出了各加油站之间的耗油量。下面是不是很easy?

    Input

    有多个测试案例。第一行先输入测试案例的数目T。对于每个测试案例,第一行输入一个整数n表示将在中途n(0 < n < 40)个城市中加油,后面紧跟着是n个整数代表每个城市有几个加油站(每个城市加油站不超过10个)。以下n+1行,每行由3个Si,Ej,L一组组成的好几对整数,该行以0结束。表示从前一城市Si第i个加油站(杭州的话就是家拉)出发到该城市第j个加油站消耗的油量为L升。

    Output

    对于每个测试,输出一行,内容为最小总耗油量。

    Sample Input

    1
    2 2 3
    1 1 3 1 2 1 0
    1 1 2 1 2 7 2 1 8 2 2 9 2 3 4 0
    1 1 5 2 1 6 3 1 6 0

    Sample Output

    10
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define max 9999999
     4 
     5 int map[500][500];
     6 int vis[500],dis[500];
     7 int sum;
     8 
     9 void dijkstra(int cost[][500],int n)
    10 {
    11     int i,j,k,minc;
    12     memset(vis,0,sizeof(vis));
    13     dis[0]=0;
    14     vis[0]=1;
    15     for(i=1;i<n;i++)dis[i]=cost[0][i];
    16         for(i=1;i<n;i++)
    17         {
    18             minc=max;
    19             for(j=0;j<n;j++)
    20             if(!vis[j]&&dis[j]<minc)
    21             {
    22                 minc=dis[j];
    23                 k=j;
    24             }
    25     if(minc==max)
    26         break;
    27     vis[k]=1;
    28     for(j=0;j<n;j++)
    29         if(!vis[j]&&dis[j]>dis[k]+cost[k][j])
    30         {
    31            dis[j]=dis[k]+cost[k][j];
    32         }
    33  }
    34 // for(i=0;i<n;i++)
    35 // printf("%d ",dis[i]);dis[]保存到每一个点的最短路
    36     printf("%d
    ",dis[n-1]);
    37 }
    38 int main()
    39 {
    40     //freopen("a.txt","r",stdin);
    41     int t,n,city[50];
    42     int s,e,l,j,i,tot;
    43     scanf("%d",&t);
    44     while(t--)
    45     {
    46         scanf("%d",&n);
    47         city[0]=0,city[1]=1;
    48         sum=0;
    49         tot=2;
    50         for(i=2;i<=n+1;i++)
    51         {
    52             scanf("%d",&city[i]);
    53             tot+=city[i];
    54         }
    55         for(i=0;i<tot;i++)
    56             for(j=0;j<tot;j++)
    57             {
    58                 map[i][j]=max;
    59             }
    60         for(i=2;i<=n+2;i++)
    61         {
    62             sum+=city[i-2];
    63             while(scanf("%d",&s)==1&&s)
    64             {
    65                 scanf("%d%d",&e,&l);
    66                 map[sum+s-1][sum+city[i-1]+e-1]=l;
    67             }
    68         }
    69 
    70         dijkstra(map,tot);
    71     }
    72 return 0;
    73 }
    View Code
     1 #include<stdio.h>
     2 #include<string.h>
     3 #define max 9999999
     4 
     5 int map[500][500];
     6 int vis[500],dis[500];
     7 
     8 void dijkstra(int cost[][500],int n)
     9 {
    10     int i,j,minc,k;
    11     memset(vis,0,sizeof(vis));
    12     for(i=0;i<n;i++)
    13     {
    14         dis[i]=cost[0][i];
    15     }
    16     vis[0]=1;
    17     dis[0]=0;
    18     for(i=1;i<n;i++)
    19     {
    20         minc=max;
    21         for(j=1;j<n;j++)
    22             if(!vis[j]&&dis[j]<minc)
    23             {
    24                 minc=dis[j];
    25                 k=j;
    26             }
    27         if(minc==max)
    28             break;
    29         vis[k]=1;
    30         for(j=1;j<n;j++)
    31             if(!vis[j]&&dis[j]>dis[k]+cost[k][j])
    32             {
    33                 dis[j]=dis[k]+cost[k][j];
    34             }
    35     }
    36    /* for(i=0;i<n;i++)
    37         printf("%d ",dis[i]);*/
    38     printf("%d",dis[n-1]);
    39 }
    40 
    41 int main()
    42 {
    43     //freopen("a.txt","r",stdin);
    44     int T,n;
    45     int city[50];
    46     int s,e,l;
    47     int sum,tot;
    48     int i,j;
    49     scanf("%d",&T);
    50     while(T--)
    51     {
    52         scanf("%d",&n);
    53         city[0]=0,city[1]=1;
    54         sum=0;
    55         tot=2;
    56         for(i=2;i<=n+1;i++)
    57         {
    58             scanf("%d",&city[i]);
    59             tot+=city[i];
    60         }
    61         for(i=0;i<tot;i++)
    62             for(j=0;j<tot;j++)
    63             {
    64                 map[i][j]=max;
    65             }
    66         for(i=2;i<=n+2;i++)
    67         {
    68             sum+=city[i-2];
    69             while(scanf("%d",&s)==1,s)
    70             {
    71                 scanf("%d%d",&e,&l);
    72                 map[sum+s-1][sum+city[i-1]+e-1]=l;
    73             }
    74         }
    75        /* for(i=0;i<tot;i++)
    76         {
    77             printf("
    ");
    78             for(j=0;j<tot;j++)
    79                 printf("%-9d",map[i][j]);
    80         }
    81         printf("
    ");*/
    82         dijkstra(map,tot);
    83     }
    84     return 0;
    85 }
    格式修改版(AC)

     http://baike.baidu.com/link?url=i_I_ioSElFOxz93l1XK4XiPfjOBYEUwEO7AaUACzgf2GUUQpnahKCqs9aDnpYq-KQCkSA97ziCtgQxI9YPZUTa

    Dijkstra算法:

    (按照原题改的,百度源代码写的有些奇怪,我改了改)

    测试数据:

    7 10
    1 2 3
    1 3 1
    2 4 2
    2 5 7
    3 4 8
    3 5 9
    3 6 4
    4 7 5
    5 7 6
    6 7 6

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<string.h>
     4 #define max1 99999999
     5 int a[1000][1000];
     6 int d[1000];//d表示某特定边距离
     7 int p[1000];//p表示永久边距离
     8 int m;//m表示边数
     9 int n;//n表示点数
    10 
    11 int main()
    12 {
    13     freopen("a.txt","r",stdin);
    14     scanf("%d%d",&n,&m);
    15     memset(p,0,sizeof(p));
    16     int min1;
    17     int x,y,z;
    18     int i,j,k;
    19     for(i=0;i<=n;i++)
    20         for(j=0;j<=n;j++)
    21         {
    22             a[i][j]=max1;
    23         }
    24     for(i=1;i<=m;i++)
    25     {
    26         scanf("%d%d%d",&x,&y,&z);
    27         a[x][y]=z;
    28       //  a[y][x]=z;
    29     }
    30   /*  for(i=1;i<=n;i++)
    31     {
    32         printf("
    ");
    33         for(j=1;j<=n;j++)
    34         {
    35             printf("%-9d",a[i][j]);
    36         }
    37     }    */
    38     printf("
    ");
    39     for(i=1;i<=n;i++)
    40         d[i]=max1;
    41     d[1]=0;
    42     for(i=1;i<=n;i++)
    43     {
    44         min1=max1;
    45         for(j=1;j<=n;j++)
    46             if(!p[j]&&d[j]<min1)
    47             {
    48                 min1=d[j];
    49                 k=j;
    50             }
    51         p[k]=1;
    52         for(j=1;j<=n;j++)
    53             if(a[k][j]!=0&&!p[j]&&d[j]>d[k]+a[k][j])
    54                 d[j]=d[k]+a[k][j];
    55     }
    56   /*  for(i=1;i<n;i++)
    57         printf("%d->",d[i]);*/
    58     printf("%d
    ",d[n]);
    59     return 0;
    60 }
    Dijkstra
  • 相关阅读:
    2020/3/21 简单的学习
    2020/3/7 A-B
    2020/3/6 旋转骰子
    2020/3/6 美丽数组
    面向对象程序设计寒假作业2
    自我介绍
    深度优先搜索-迷宫问题(走迷宫题解)
    开机方案题解
    好吃的巧克力题解
    数楼梯题解
  • 原文地址:https://www.cnblogs.com/get-an-AC-everyday/p/4189118.html
Copyright © 2020-2023  润新知