poj1797 dijkstra

 

 

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

 

     题目给出一个没有负权的图,权代表承重亮,要求从起点到终点装的货物的最大值。

 

    将dijsktra的松弛操作略微更改dis[j]=MAX(dis[j],MIN(dis[k],a[k][j]));dij[j]是起点到j点可以载货的最大值,在dis[k]和a[k][j]中取一个最小值,然后再在它和dis[j]中取最大。

   

#include<iostream>
using namespace std;
#define MAXN 1005
int a[MAXN][MAXN];
int dis[MAXN];
bool vis[MAXN];
int MAX(int a,int b)
{return a>b?a:b;}
int MIN(int a,int b)
{return a>b?b:a;}

void dij(int v,int n)
{
 memset(vis,false,sizeof(vis));
 int i,j;
 for(i=1;i<=n;i++)
  dis[i]=a[v][i];
 vis[v]=true;
 for(i=1;i<n;i++)
 {
  int temp=-1,k=v;
  for(j=1;j<=n;j++)
  {
   if(vis[j]) continue;
   if(temp<dis[j])
   {
    temp=dis[j];
    k=j;
   }
  }
  vis[k]=true;
  for(j=1;j<=n;j++)
  {
   if(vis[j]) continue;
   dis[j]=MAX(dis[j],MIN(dis[k],a[k][j]));
  }
 }
}
int main()
{
 int N;
 cin>>N;
 int count=0;
 while(N–)
 {
  count++;
  memset(a,-1,sizeof(a));
  int n,m;
  scanf(“%d %d”,&n,&m);
  int i;
  for(i=1;i<=m;i++)
  {
   int t1,t2,w;
   scanf(“%d %d %d”,&t1,&t2,&w);
   a[t1][t2]=w;
   a[t2][t1]=w;
  }
  dij(1,n);
  printf(“Scenario #%d:\n%d\n”,count,dis[n]);
  printf(“\n”);
 }
}

 

    原文作者:Dijkstra算法
    原文地址: https://blog.csdn.net/Twenty_seven/article/details/41785697
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞