1. 程式人生 > >一本通之信使(弗洛伊德算法)

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

ffffff () col include %d sin 情況 esp namespace

問題為信使到達所有點用的最小時間。

一個點的所有信使同時出發,這會使一個點產生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); }

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