poj1797

来源:互联网 发布:网络如何赚钱 编辑:程序博客网 时间:2024/06/04 19:13

原题地址:

http://poj.org/problem?id=1797

题意:

n条公路,要把物品从公路1运送到公路n
每条路都有其最大承载量
要求将物品从1运到N的过程,一次所能运的最多的货物

简单解读题意:

一次能运的最多的货物,即,在到达N的路线中,承载量最小的道路的承载量。
要使承载量最小的道路的承载量最大,即,采用迪杰斯特拉算法,从起点向外扩展,每次都选择承载量最大的路线。当两个路之间无法到达时,默认其承载量为零。即,无法搬运货物。
代码如下:

#include <iostream>#include<cstring>#include<cstdio>#define min(a,b) (a<b?a:b)using namespace std;#define MAX 1005int map[MAX][MAX];bool vis[MAX];int d[MAX];int n,m;void dijisktra(){   int i,j,Max,v;   for(i=1;i<=n;i++)   {    d[i]=map[1][i];    vis[i]=0;   }//初始化路径数组   for(i=1;i<=n;i++)   {    Max=-1;//将默认的最大数初始化为最小    for(j=1;j<=n;j++)    {        if(!vis[j]&&d[j]>Max)        {            Max=d[j];            v=j;        }    }//每次都找最大的路线        vis[v]=1;        for(j=1;j<=n;j++)        {            if(!vis[j]&&d[j]<min(d[v],map[v][j]))                d[j]=min(d[v],map[v][j]);        }//更新dx    }   }int main(){    int T,t;    int i,j;    t=0;    scanf("%d",&T);    while(T){        T--;        scanf("%d%d",&n,&m);        for(i=1;i<=n;i++)        for(j=1;j<=n;j++)        map[i][j]=0;//初始化地图。        //先默认所有的路线都无法到达        int a,b,c;        for(i=1;i<=m;i++)        {            scanf("%d%d%d",&a,&b,&c);            map[a][b]=map[b][a]=c;        }//输入地图。        dijisktra();        t++;       printf("Scenario #%d:\n",t);       printf("%d\n\n",d[n]);    }    return 0;}
原创粉丝点击