用的Dijkstra 最短路的算法 此时不是记录的x 到y的最短路径 而是在这一段上的 各个分段中的最小权值
#include <algorithm> #include <cstring> #include <iostream> #include <vector> #include <queue> #include <cstdio> #define N 10010 #define INF 0x3f3f3f3f using namespace std; int n,m; int u,v,w; int p[N][N]; int dp[N]; int vis[N]; int main() { int cas=0; while(scanf("%d %d",&n,&m)==2) { if(!n && !m) return 0; memset(p, 0, sizeof(p)); for(int i=0; i<m; ++i) { scanf("%d %d %d",&u,&v,&w); p[u][v]=p[v][u]=w; } scanf("%d %d %d",&u,&v,&w); memset(vis, 0, sizeof(vis)); memset(dp, 0, sizeof(dp)); dp[u]=INF; for(int i=1; i<=n; ++i) { int x,m=0; for(int y=1; y<=n; ++y) if(!vis[y] && dp[y]>=m) m=dp[x=y]; vis[x]=1; for(int y=1; y<=n; ++y) dp[y]=max(dp[y],min(dp[x],p[x][y])); } int ans=w/(dp[v]-1); if(w%(dp[v]-1)) ans++; printf("Scenario #%d\n",++cas); printf("Minimum Number of Trips = %d\n\n",ans); } return 0; }