本文主要是介绍poj1797 dijsktra变形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
如题:http://poj.org/problem?id=1797
Time Limit: 3000MS | Memory Limit: 30000K | |
Total Submissions: 21783 | Accepted: 5793 |
Description
Hugo Heavy is happy. After the breakdown of the Cargolifter project he can now expand business. But he needs a clever man who tells him whether there really is a way from the place his customer has build his giant steel crane to the place where it is needed on which all streets can carry the weight.
Fortunately he already has a plan of the city with all streets and bridges and all the allowed weights.Unfortunately he has no idea how to find the the maximum weight capacity in order to tell his customer how heavy the crane may become. But you surely know.
Problem
You are given the plan of the city, described by the streets (with weight limits) between the crossings, which are numbered from 1 to n. Your task is to find the maximum weight that can be transported from crossing 1 (Hugo's place) to crossing n (the customer's place). You may assume that there is at least one path. All streets can be travelled in both directions.
Input
Output
Sample Input
1 3 3 1 2 3 1 3 4 2 3 5
Sample Output
Scenario #1: 4
Source
题意:给出一堆双向边,权值是本条路可运输的最大量。求出最大能运输多重的东西
思路:不难发现,一条路径最大运输量取决于这条路径的最小权值边。对dijsktra算法松弛操作进行修改。
dis[i]代表到当前顶点i的这条路径的最大承重值。
for(j=1;j<=n;j++)
{
if(vis[j]) continue;
dis[j]=MAX(dis[j],MIN(dis[k],a[k][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()
{
// freopen("C:\\1.txt","r",stdin);
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");
}
}
这篇关于poj1797 dijsktra变形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!