• [TYVJ] P1238 路径


    路径

    描述 Description
    图是由一组顶点和一组边组成的。一条边连接两个顶点。例如,图1表示了一个有4个顶点V、5条边的图。图中,每条边e是有方向的,方向从起点到终点,并且每条边都有价值。用整数0,1,…,m-1可以表示一个有m个顶点的图。

    图1                                      图2
    一条路径连接了一个点Vi和另一个点Vj,其方向与经过的一系列边的方向一致。路径的长度是途经边的条数,路径的费用是边价值的总和。对于一个给定的图,你的任务是在所有最短路径中,找出需要最少费用的连接V0和V1的路径。一个需要最少费用的最短路径称之为廉价最短路径。

    让我们重新考虑图1,从0到1的最短路径是只含一条边的路径0→1,费用是10。当然,还有更便宜的路:0→2→1和 0→3→1,但是它们比第一条路径长(有2条边)。所以,0→1是廉价最短路径。
    看一下另一个例子,图2,它有2条最短路径,其长度是2,路径0→3→1(费用=4)比路径0→2→1(费用=5)花费少。还用另一条路径0→2→3→1(费用=3),虽然便宜但是很长。所以,廉价最短路径是0→3→1。
     
    输入格式 InputFormat
    输入文件第一行有两个整数m和n,用一个空格隔开,其中,m是顶点数,而n是边数。接下来的n行给出所有的边及其价值,每行有3个整数(相邻两个整数间有一个空格),表示起点,终点和边的价值。顶点最多有100个,编号在0到99之间。边最多有1000条,其价值在0到215-1之间。
     
    输出格式 OutputFormat
    输出文件仅有一行包含一个整数,即V0→V1的廉价最短路径的费用。当出现有多个廉价最短路径的情况时,它们的费用是一样的。
     
    样例输入 SampleInput [复制数据]

    4 5
    0 2 2
    0 3 2
    0 1 10
    2 1 2
    3 1 2

    样例输出 SampleOutput [复制数据]

    10

    题解:找廉价最短路径,要求路径最短,则根据最短路松弛特点,在每条边的权值上加上一个较大的数x,最后输出结果mod x即可。顶点m<=100,数据规模较小,floyd就可以AC。

    代码:

     1 #include<stdio.h>
     2 #include<string.h>
     3 int i,j,n,m,k,x,y,z,a[110][110],
     4     mx=351111;
     5 int 
     6 pre(void)
     7 {
     8     memset(a,2,sizeof(a));
     9     return 0;
    10 }
    11 
    12 int
    13 add(int x,int y,int z)
    14 {
    15     if ((mx+z)<a[x][y]) 
    16         a[x][y]=z+mx;
    17     return 0;
    18 }
    19 
    20 int 
    21 min(int a,int b)
    22 {
    23     if (a<b) return(a);
    24     else return(b);
    25 }
    26 
    27 int
    28 init(void)
    29 {
    30     scanf("%d%d",&m,&n);
    31     for(i=1;i<=n;i++)
    32     {
    33         scanf("%d%d%d",&x,&y,&z);
    34         add(x,y,z);
    35     }
    36     return 0;
    37 }
    38 
    39 int 
    40 main(void)
    41 {
    42     pre();
    43     init();
    44     
    45     for(k=0;k<=m-1;k++)
    46         for(i=0;i<=m-1;i++)
    47             for(j=0;j<=m-1;j++)
    48             if ((i!=j)&&(i!=k)&&(k!=j))
    49             a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
    50     
    51     printf("%d
    ",a[0][1]%mx);
    52     return 0;
    53 }
    54     
  • 相关阅读:
    sed替换
    【工作提升】好员工秘诀十二条
    【工作提升】怎么样做工作才有好的效果
    vim删除空行和注释
    Java实现几种常见排序方法
    数据背后的二八定律,揭示程序员担忧的主要问题
    【新闻】国内第一本介绍程序员996现象的技术图书上市,“再谈工作996,生病ICU”一文受关注
    10年磨一剑:《SOD框架“企业级”应用数据架构实战》一书正式上市
    程序员肺被切掉一块还得去加班... 再谈“工作996,生病ICU”
    win10编译pdfium
  • 原文地址:https://www.cnblogs.com/sxiszero/p/3601629.html
Copyright © 2020-2023  润新知