用的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;
}
View Code

 

posted on 2013-10-09 18:49  风流monkey  阅读(125)  评论(0编辑  收藏  举报