一本通之信使(弗洛伊德算法)

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

 一个点的所有信使同时出发,这会使一个点产生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);
}

猜你喜欢

转载自www.cnblogs.com/lcez56jsy/p/10744540.html
今日推荐