POJ 1797 Heavy Transportation

题目大意:谢谢羽哥提供的题目大意,哎,心寒了,英语太差了,对不起6级证书啊~~55~~题目大意就是求最大载重量,

也就是求每条路径的最小值,所有的路径最小值的最大值~~

思路:我怎么想都想不到地杰斯特拉上面啊~~55~~刚开始还以为是floyd,后来和杨烁讨论的时候像是最大生成树,最后好多博客都用变形dijkstra做了,

55~~做的好不爽~~只是码代码~~思想不是自己的额~~就连一成都不是~~55~~路还长啊

变形处:找最大的边,dis的无法到达的边初始化为0,map[][]无法到达的也初始化为0,因为求最大边嘛~~更新的时候只能用   最新最大的边  和 走过来的边两者中最小值去更新

有点网络流的的味道,另外,把cin改成scanf竟然由1700ms变成360ms~~我勒个去~~

program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define inf -1000000
int n,mm;
int cas=1;
int  m[1002][1002];
int dis[1002];
int flag[1002];
void dijkstra()
{
  for(int i=1;i<=n;i++)
           m[i][i]=inf;      
     
  memset(flag,0,sizeof(flag));
  memset(dis,0,sizeof(dis));
  flag[1]=1;
  for(int i=1;i<=n;i++)
    dis[i]=m[1][i];
  
  for(int i=1;i<=n;i++)
  {
     int max=inf;
     int t;
     for(int k=1;k<=n;k++)
        {
            if(flag[k]==0&&dis[k]>max)
             {
                 max=dis[k];
                 t=k;
             }
               
        }
     flag[t]=1;
     if(t==n)
        {
          //cout<<"Scenario #"<<cas++<<':'<<endl;
          printf("Scenario #%d:\n",cas++);
          printf("%d\n\n",max);
          //cout<<max<<endl<<endl;
          break;
        }
     for(int k=1;k<=n;k++)
     {
        if(flag[k]==0&&dis[k]<min(dis[t],m[t][k]))
            dis[k]=min(dis[t],m[t][k]);    
     }
     
          
  }    
}
int main()
{
int test;
//cin>>test;
scanf("%d",&test);
while(test--)
{
   memset(m,0,sizeof(m));
   scanf("%d%d",&n,&mm);//cin>>n>>mm;
   for(int i=1;i<=mm;i++)
   {
     int a,b,w;
     //cin>>a>>b>>w;
     scanf("%d%d%d",&a,&b,&w);
     m[a][b]=w;
     m[b][a]=w;       
   }          
   dijkstra();
   
}  
//system("pause");
return 0;
}

你可能感兴趣的:(POJ 1797 Heavy Transportation)