问题为信使到达所有点用的最小时间。
一个点的所有信使同时出发,这会使一个点产生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); }