POJ-1797-Heavy-Transportation


title: POJ-1797-Heavy Transportation
categories:

  • ACM
  • dij
    tags:
  • 最大最小距离
    date: 2020-03-06 08:57:10

dij用途还是很广的,稍微分析一下可行性就可以。可行性主要表现在两部分,第一部分筛选最优解,第二部分更新当前状态。只要这两点可行就可以。注意不能图省事两个循环同时计算和求最优解。

题目

重型运输

时限: 3000MS 内存限制: 30000K
提交总数: 66100 接受: 16246

描述

背景
雨果重工很高兴。Cargolifter项目崩溃后,他现在可以扩展业务。但是他需要一个聪明的人,告诉他从客户建造巨型钢起重机的地方到所有街道都可以承载重量的地方是否真的有办法。
幸运的是,他已经制定了一个计划,包括所有街道,桥梁和所有允许的重量。不幸的是,他不知道如何找到最大重量来告诉客户起重机的重量。但是你当然知道。

问题

系统会为您提供城市规划,由交叉口之间的街道(权重限制)描述,该街道编号为1到n。您的任务是找到从1号交叉口(Hugo的位置)到n号交叉口(客户的位置)可以运输的最大重量。您可以假设至少有一条路径。所有街道均可双向行驶。

输入值

第一行包含方案(城市计划)的数量。对于每个城市,第一行给出的是路口交叉口数量n(1 <= n <= 1000)和街道数量m。接下来的m行包含整数的三元组,这些整数指定了道路的起点和终点交叉点以及允许的最大权重,该权重为正且不大于1000000。每对交叉点之间最多有一条街道。

输出量

每个方案的输出都以包含“方案#i:”的行开头,其中i是从1开始的方案编号。然后打印一行,其中包含Hugo可以运输给客户的最大允许重量。用空白行终止方案的输出。

样本输入

1个
3 3
1 2 3
1 3 4
2 3 5

样本输出

方案1:
4

算法

#include<iostream>
#include<stdio.h>
using namespace std;
int map[1001][1001];
int d[1001];
bool v[1001];
int q=1;
int n,index,m,maxx;
void dij(){
	int i,j;
	for(i=1;i<=n;i++)
	{
		v[i]=0;
		d[i]=map[1][i];
	}
	v[1]=1;
	while(v[n]!=1)
	{
		maxx=-1;
		for(i=1;i<=n;i++)
		{
			if(v[i]==0&&d[i]>maxx)
			{
				maxx=d[i];
				index=i;
			}
		}
		v[index]=1;
		for(i=1;i<=n;i++)
		{
			int tt=map[index][i]<d[index]?map[index][i]:d[index];
			if(v[i]==0&&(d[i]<tt))
			{
				d[i]=tt;
			}
		}
	}
	printf("Scenario #%d:\n%d\n\n",q++,d[n]);
}
int main()
{	
	//freopen("input.txt", "r", stdin);
	int t;
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				map[i][j]=0;
				
			}
		}
		for(int i=1;i<=m;i++)
		{
			int a,b,w;
		scanf("%d%d%d",&a,&b,&w);
			map[a][b]=map[b][a]=w;
		}
		dij();	
	}
	return 0;
} 
发布了25 篇原创文章 · 获赞 1 · 访问量 482

猜你喜欢

转载自blog.csdn.net/qq_43985303/article/details/104753437