zoukankan      html  css  js  c++  java
  • 最短路+1

    1、最短路上的统计

    题目:一个无向图,没有自环,所有边的权值均为1,对于一个点对(a,b),输出a,b之间所有最短路上的点的总个数。

    题解:floyed求出所有的最短路,

    如果 map[a,b]=map[a,k]+map[k,b] 那么 k 就是 a b 最短路上的点。最后输出总个数+2。

    编译通过... 
    ├ 测试数据 01:答案正确... 0ms 
    ├ 测试数据 02:答案正确... 0ms 
    ├ 测试数据 03:答案正确... 0ms 
    ├ 测试数据 04:答案正确... 0ms 
    ├ 测试数据 05:答案正确... 0ms 
    ├ 测试数据 06:答案正确... 0ms 
    ├ 测试数据 07:答案正确... 0ms 
    ├ 测试数据 08:答案正确... 0ms 
    ├ 测试数据 09:答案正确... 0ms 
    ├ 测试数据 10:答案正确... 0ms 
    ------------------------- 
    Accepted 有效得分:100 有效耗时:0ms  
    View Code 
     1 #include <stdio.h>
     2 #define N 101
     3 int main()
     4 {
     5     int map[N][N];
     6     int i,j,k,n,m,t,s,a,b;
     7     scanf("%d%d",&n,&m);
     8     for(i=1;i<=n;i++)
     9         for(j=1;j<=n;j++)
    10             map[i][j]=999999;
    11     for(i=0;i<m;i++)
    12     {
    13         scanf("%d%d",&a,&b);
    14         map[a][b]=1;
    15         map[b][a]=1;
    16     }
    17     for(k=1;k<=n;k++)
    18         for(i=1;i<=n;i++)
    19             for(j=1;j<=n;j++)
    20                 if(map[i][k]+map[k][j]<map[i][j])
    21                     map[i][j]=map[i][k]+map[k][j];
    22     scanf("%d",&t);
    23     while(t--)
    24     {
    25         s=0;
    26         scanf("%d%d",&a,&b);
    27         for(i=1;i<=n;i++)
    28             if(map[a][i]+map[i][b]==map[a][b]&&i!=a&&i!=b)
    29                 s++;
    30         printf("%d\n",s+2);
    31     }
    32     return 0;
    33

    2、 想越狱的小杉

    描述 Description
    小杉看了看自己的纹身,明白了整个管道网是由N个小房间和若干小房间之间的单向的管道组成的。 小房间编号为不超过N的正整数。 每个管道都有一个人品限制值,小杉只能在人品不 超过该限制值时通过。 小杉一开始在房间1,现在小杉想知道,每个小房间他最多能够以人品多少的状态到达。 注意,小杉的人品在出发以后是不会改变的。
    输入格式 Input Format
    每组测试数据的 
    第一行有一个正整数N(1<=N<=2000)。 
    接下来若干行描述管道,每行三个正整数A,B,R(1<=A,B<=N, 1<=R<1e5, A<>B),表示A房间有一条到达B房间的人品限制值为R的管道(注意从B房间不可由此管道到达A房间,即 管道是单向的,每组A,B至多只出现一次)。 
    整个输入数据以一行0 0 0结束。 
    输出格式 Output Format
    N-1行 

    为到达2~n个房间时的最大人品 

     编译通过... 

    ├ 测试数据 01:答案正确... 0ms 
    ├ 测试数据 02:答案正确... 0ms 
    ├ 测试数据 03:答案正确... 0ms 
    ├ 测试数据 04:答案正确... 41ms 
    ├ 测试数据 05:答案正确... 0ms 
    ├ 测试数据 06:答案正确... 0ms 
    ├ 测试数据 07:答案正确... 0ms 
    ├ 测试数据 08:答案正确... 0ms 
    ├ 测试数据 09:答案正确... 0ms 
    ├ 测试数据 10:答案正确... 0ms 
    ------------------------- 

    Accepted 有效得分:100 有效耗时:41ms  

    View Code 
     1 #include <stdio.h> 
     2 int n; 
     3 long map[2001][2001]={0}; 
     4 int mark[2001]={0}; 
     5 long maxrp[2001]={0}; 
     6 long min(long a,long b) 
     7 {
     8     return a<b?a:b;
     9 }
    10 int main() 
    11 { 
    12     long a,b,c; 
    13     scanf("%d",&n); 
    14     while(~scanf("%d%d%ld",&a,&b,&c)) 
    15     { 
    16         if(a==0&&b==0&&c==0
    17             break;      
    18         map[a][b]=c;         
    19     } 
    20     int i,j,k; 
    21     long maxcost=0,maxnum; 
    22     maxrp[1]=0;mark[1]=1
    23     for(i=2;i<=n;i++)
    24         maxrp[i]=map[1][i];
    25     for(k=1;k<=n;k++) 
    26     {
    27         maxcost=0;
    28         maxnum=0
    29         for(i=1;i<=n;i++) 
    30             if(!mark[i])
    31                 if(maxrp[i]>maxcost) 
    32                 { 
    33                     maxcost=maxrp[i]; 
    34                     maxnum=i;
    35                 } 
    36         mark[maxnum]=1
    37         for(j=1;j<=n;j++) 
    38             if(!mark[j]) 
    39                 if(maxrp[j]<min(maxrp[maxnum],map[maxnum][j])) 
    40                     maxrp[j]=min(maxrp[maxnum],map[maxnum][j]);  
    41     } 
    42     for(i=2;i<=n;i++) 
    43         printf("%ld\n",maxrp[i]); 
    44     return 0;
    45

    3、 最佳路线

    描述 Description
    年久失修的赛道令国际汽联十分不满。汽联命令主办方立即对赛道进行调整,否则将取消其主办权。主办方当然必须马上开始行动。 
    赛道测评人员经过了三天三夜的数据采集,选出了若干可以使用的道路和各道路行驶所需的时间。这些道路包括若干直道和弯道,每个直道连接两个不同的弯道且为单向,两个弯道之间可 能有多条直道,通过直道和弯道都需要一定的时间。主办方打算在这些可用道路中选出一部分作为赛道。赛道是由直道和弯道交替组成的一圈,赛道可多次经过同一条弯道,因为主办方可 以通过架设立交桥的方法避免撞车。为了使比赛更加精彩,主办方希望选择一条单圈时间最短的赛道,由于观众席的位置在弯道1,所以赛道必须经过弯道1(赛道至少要包含一条直 道)。
    输入格式 Input Format
    第一行是两个整数n,m(1<=n<=200,1<=m<=100000),分别表示弯道数和直道数。接下来n行,第i行是一个整数ai(1<=ai<=1000),表示通过第i个弯道所消耗的时间。接 下来m行,第j行是三个整数xj,yj,bj(1<=xj,yj<=n,1<=bj<=1000),表示从弯道xj到弯道yj有一条单向直道,且通过该直道所消耗的时间为bj。
    输出格式 Output Format

    一个整数s,表示单圈时间最短的赛道的单圈时间,若无解则输出-1。 

     编译通过... 

    ├ 测试数据 01:答案正确... 0ms 
    ├ 测试数据 02:答案正确... 0ms 
    ├ 测试数据 03:答案正确... 0ms 
    ├ 测试数据 04:答案正确... 0ms 
    ├ 测试数据 05:答案正确... 0ms 
    ├ 测试数据 06:答案正确... 0ms 
    ├ 测试数据 07:答案正确... 25ms 
    ├ 测试数据 08:答案正确... 0ms 
    ├ 测试数据 09:答案正确... 0ms 
    ├ 测试数据 10:答案正确... 0ms 
    ------------------------- 

    Accepted 有效得分:100 有效耗时:25ms  


    View Code 
     1 #include <stdio.h>
     2 #define N 201
     3 int main()
     4 {
     5     int d[N],map[N][N];
     6     int a,b,c,n,m,i,j,k;
     7     scanf("%d%d",&n,&m);
     8     for(i=1;i<=n;i++)
     9         scanf("%d",&d[i]);
    10     for(i=1;i<=n;i++)
    11         for(j=1;j<=n;j++)
    12             map[i][j]=99999;
    13     for(i=0;i<m;i++)
    14     {
    15         scanf("%d%d%d",&a,&b,&c);
    16         c+=d[b];
    17         if(c<map[a][b])
    18             map[a][b]=c;
    19     }
    20     for(k=1;k<=n;k++)
    21         for(i=1;i<=n;i++)
    22                 for(j=1;j<=n;j++)
    23                     if((map[i][k]+map[k][j]<map[i][j]))
    24                         map[i][j]=map[i][k]+map[k][j];
    25     if(map[1][1]==99999)
    26         puts("-1");
    27     else
    28         printf("%d\n",map[1][1]);
    29     return 0;
    30

  • 相关阅读:
    Java 学习总结(一)
    每日学习心得:SharePoint 为列表中的文件夹添加子项(文件夹)、新增指定内容类型的子项、查询列表中指定的文件夹下的内容
    每日学习心得:SharePoint 2013 自定义列表项添加Callout菜单项、文档关注、SharePoint服务端对象模型查询
    HighCharts使用心得
    ECharts使用心得总结(二)
    每日学习心得:Js基本数据类型常用方法扩展
    每日学习心得:$.extend()方法和(function($){...})(jQuery)详解
    Mustache 使用心得总结
    Extjs editor 设置默认值
    Ext this.getView(...).saveDocumentAs is not a function
  • 原文地址:https://www.cnblogs.com/pony1993/p/2594553.html
Copyright © 2011-2022 走看看