poj 2263 Heavy Cargo 最短路 变形

题意:有n个城市,m条连接两个城市的道路(双向边),每条道路有自己的最大复载量。现在问从城市a到城市b,车上的最大载重能为多少。即求从a到b的路径中权值最小边的最大值

分析:贪心的思想,我们每次找 道路载重量最大的路加入集合中,其思想于最短路思想基本上是一样的,所以用最短路的思想解题,dist值改为路径上最大上限(相当于最大流,这里用最短路来解)

View Code
#include <cstdio>
#include <cstring>
#include <iostream>
#include <string>
#include <map>
using namespace std;
#define inf (1<<29)
const int maxn = 110 , maxm = 10010;
int n , m;
int cnt;
map<string,int> mp;
struct Edge{ int v,w,next; }edge[maxm];
int E, head[maxn];
inline void init() { E=0;memset(head,-1,sizeof(head)); }
inline void addedge(int u,int v,int w) {
    edge[E].v=v;edge[E].w=w;edge[E].next=head[u];head[u]=E++;
    edge[E].v=u;edge[E].w=w;edge[E].next=head[v];head[v]=E++;
}
int dist[maxn];
bool vis[maxn];
int dijkstra(int a, int b) {
    for(int i=0;i<cnt;i++) dist[i] = 0 , vis[i] = 0;
    dist[a] = inf;
    while(1) {
        int u = -1 , Min = 0;
        for(int i=0;i<cnt;i++) if(!vis[i] && ( u==-1 || dist[i] > Min )) Min = dist[u=i];
        if(u == b) return dist[u];
        if(u==-1) break;
        vis[u] = 1;
        dist[u] = Min;
        for(int i=head[u];i!=-1;i=edge[i].next) {
            int v = edge[i].v;
            if(!vis[v] && dist[v] < min(dist[u] , edge[i].w)) dist[v] = min(dist[u] , edge[i].w);
        }
    }
    return -1;
}
int main() {
    int  cas = 1;
    string leno , hoo;
    while(~scanf("%d%d",&n,&m) && n) {
        cnt = 0;
        int u , v , w;
        mp.clear();
        init();
        for(int i=0;i<m;i++) {
            cin>>leno>>hoo>>w;
            if(mp[leno]==0) mp[leno] = cnt++;
            if(mp[hoo] ==0) mp[hoo]  = cnt++;
            u = mp[leno];
            v = mp[hoo];
            addedge(u,v,w);
        }
        cin>>leno>>hoo;
        u = mp[leno];
        v = mp[hoo];
        int ans = dijkstra(u,v);
        printf("Scenario #%d\n%d tons\n\n",cas++,ans);
    }
    return 0;
}
posted @ 2012-07-02 04:41  lenohoo  阅读(210)  评论(0编辑  收藏  举报