poj 1797 Heavy Transportation (spfa 最短路 )

 

给出一个图 图中每段路都有个载重量 一条路径的总载重量为奇各段路中 载重量最小的值   找从1到n的各路径中总载重量最大的 

d[i]  为从起点到 点i 的路径中 总载重量最大的

只要将spfa 松弛的条件改一下 就好了

if(d[b]<min(d[a],w[a][b]) 

      d[b]=min(d[a],w[a][b])

 

#include<iostream>
#include<string.h>
#include<queue>
#include<vector>
#define INF 100000000
using namespace std;

vector <int > g[2002],w[2002];
int vis[2002],d[2002];

int min(int a,int b)
{
    return a<b?a:b;
}

void spfa(int s,int n)
{
    queue <int > q;
    memset(vis,0,sizeof(vis));
    memset(d,0,sizeof(d));
    q.push (1);//vis[1]=1;
    while(!q.empty ())
    {
        int a,b,v;
        a=q.front (); q.pop (),vis[a]=0;
        for(int i=0;i<g[a].size ();i++)
        {
            b=g[a][i];  
            v=w[a][i];
            if(a==1)
            {
                d[b]=v;
                q.push(b);
                vis[b]=1;
            
            }
            else if(min(d[a],v)>d[b])
            {
                d[b]=min(d[a],v);
                if(!vis[b])
                {
                    q.push (b);
                    vis[b]=1;
                }
            }
            
        }
    }
}
    

    

int main() 
{
    int i,n,m,t,a,b,c,p=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        for(i=1;i<=m;i++)
        {
            scanf("%d%d%d",&a,&b,&c);
            g[a].push_back (b);
            w[a].push_back (c);
            g[b].push_back (a);
            w[b].push_back (c);
        }
        spfa(1,n);
        printf("Scenario #%d:\n",p++);
        printf("%d\n\n",d[n]);
        for(int j=1;j<=n;j++)
        {
            g[j].clear ();
            w[j].clear ();
        }
    }
    return 0;
}

 

posted @ 2013-07-29 11:04  galaxy77  阅读(275)  评论(0编辑  收藏  举报