zoukankan      html  css  js  c++  java
  • 一本通之信使(弗洛伊德算法)

    问题为信使到达所有点用的最小时间。

     一个点的所有信使同时出发,这会使一个点产生n种情况,所以我们不能把每一个点拆开看。那我们从整体上看这个题,问的就是从①点到每个点的最小时间中最大的那个数。如果有不能到达的点,就输出-1。

    所以我们要先算出①到达每个点的最小时间。这个可以用弗洛伊德算法,虽然有些费时,但是因为题目数据可能会出现负数,dijkstra算不了。

    算出后,再找到最大的那个时间输出即可。如果最大时间是inf(初始化用的那个数),就说明有无法到达的点,要输出-1。

    #include<iostream>
    #include<cstdio>
    #include<queue>
    using namespace std;
    int g[101][101],n,m;
    const int inf=0x7ffffff;//注意这里只有6个f,7个f会炸
    int main()
    {scanf("%d%d",&n,&m);
      for(int i=1;i<=n;i++)
       {for(int j=1;j<=n;j++)
         g[i][j]=inf;
         g[i][i]=0;
       }for(int i=1;i<=m;i++)
      {int x,y,k;
       scanf("%d%d%d",&x,&y,&k);
       g[x][y]=k;
       g[y][x]=k;
      }
      for(int k=1;k<=n;k++)
      {for(int i=1;i<=n;i++)
        {for(int j=1;j<=n;j++)
          {if(g[i][j]>g[i][k]+g[k][j])
            g[i][j]=g[i][k]+g[k][j];
          }
        }
      }int maxn=-inf;//因为会有负数,所以maxn初始化为负无限大
      for(int i=1;i<=n;i++)
       if(g[1][i]>maxn)
         maxn=g[1][i];
     if(maxn==inf)
       printf("-1");
     else
       printf("%d",maxn);
    }
  • 相关阅读:
    Angular 中使用第三方模块 axios 请求数据
    angular 创建服务
    Promise和RxJS处理异步对比
    ES6中的迭代器(Iterator)和生成器(Generator)
    async await
    Ajax分析
    JSTL
    EL
    Spring-常用依赖及配置
    Spring-AOP的三种方式
  • 原文地址:https://www.cnblogs.com/lcez56jsy/p/10744540.html
Copyright © 2011-2022 走看看