题目
799:Heavy Transportation
查看提交统计提问
总时间限制: 3000ms 内存限制: 65536kB
描述
Background 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.
输入
The first line contains the number of scenarios (city plans). For each city the number n of street crossings (1 <= n <= 1000) and number m of streets are given on the first line. The following m lines contain triples of integers specifying start and end crossing of the street and the maximum allowed weight, which is positive and not larger than 1000000. There will be at most one street between each pair of crossings.
输出
The output for every scenario begins with a line containing “Scenario #i:”, where i is the number of the scenario starting at 1. Then print a single line containing the maximum allowed weight that Hugo can transport to the customer. Terminate the output for the scenario with a blank line.
样例输入
1
3 3
1 2 3
1 3 4
2 3 5
样例输出
Scenario #1:
4
翻译
799:重型运输
描述
背景
雨果·赫维(Hugo Heavy)很高兴。在货运飞艇项目失败后,他现在可以拓展业务了。
但他需要一个聪明的人来告诉他,从客户建造巨型钢起重机的地方到需要使用起重机的地方,
是否真的存在一条所有街道都能承受其重量的路线。
幸运的是,他已经有了一张城市地图,上面标注了所有街道、桥梁以及允许通过的重量。
不幸的是,他不知道如何找出最大承重能力,以便告知客户起重机最大可以造多重。但你肯定知道。
问题
给你一张城市地图,用交叉路口(编号从 1 到 n)之间的街道(带有重量限制)来描述。
你的任务是找出从交叉路口 1(雨果所在的地方)到交叉路口 n(客户所在的地方)能够运输的最大重量。
你可以假设至少存在一条路径。所有街道都可以双向通行。
输入
第一行包含场景(城市地图)的数量。对于每个城市,
第一行给出街道交叉路口的数量 n(1 ≤ n ≤ 1000)和街道的数量 m。接下来的 m 行包含三个整数,
分别指定街道的起点交叉路口、终点交叉路口以及最大允许重量,该重量为正数且不超过 1000000。
每对交叉路口之间最多有一条街道。
输出
每个场景的输出以包含 “Scenario #i:” 的一行开始,其中 i 是从 1 开始的场景编号。
然后打印一行,包含雨果能够运输给客户的最大允许重量。每个场景的输出以一个空行结束。
样例输入
1
3 3
1 2 3
1 3 4
2 3 5
代码
#include <bits/stdc++.h>
using namespace std;
struct roads{
int id,weight;
bool operator<(const roads& b)const{return weight<b.weight;}
};
int t,//组数
n,//城市数
m,//道路数
city[1001],//各城市最大称重
ans;
vector<roads> road[1001];//各城市出发的道路
priority_queue<roads> q;//始发城市优先队列
void view(int s,int t){
cout<<"从"<<s<<"到达"<<t<<endl;
cout<<"城市:\t";for(int i=1;i<=n;i++)cout<<i<<"\t";cout<<endl;
cout<<"承重:\t";for(int i=1;i<=n;i++)cout<<city[i]<<"\t";cout<<endl;
}
void view(string s){
cout<<s<<endl;
for(int i=1;i<=n;i++){
cout<<"道路始发"<<i<<endl;
cout<<"到城市:\t";for(int j=0;j<road[i].size();j++)cout<<road[i][j].id<<"\t";cout<<endl;
cout<<"路承重:\t";for(int j=0;j<road[i].size();j++)cout<<road[i][j].weight<<"\t";cout<<endl;
}
}
int main(){
//freopen("data.cpp","r",stdin);
cin>>t;
for(int j=1;j<=t;j++){
cin>>n>>m;
memset(city,0,sizeof(city));//多组数据初始化
for(int i=1;i<=n;i++)road[i].clear();//清空各城市邻接城市
for(int i=1;i<=m;i++){//每道路
int a,b,w;
cin>>a>>b>>w;
road[a].push_back(roads{b,w});//不能忘了,是双向
road[b].push_back(roads{a,w});
}
city[1]=1000000;
q.push(roads{1,1000000});//1城市始发
ans=0;
//view("各城市的邻接情况");
while(!q.empty()){//宽搜
roads s=q.top();q.pop();//始发城市
if(s.weight<city[n])continue;//剪枝,如果低于目标城市的承重,就可以不要了
if(s.id==n)ans=max(ans,s.weight);//到达终点留下更高值
for(int i=0;i<road[s.id].size();i++){//遍历邻接城市
roads e=road[s.id][i];//到达城市
int minw=min(s.weight,e.weight);//从始发城市和道路承重里找到最低承重
if(minw>city[e.id]){//该最低承重如果多于目标城市的承重,那就是新承重
city[e.id]=minw;
q.push(roads{e.id,minw});
//view(s.id,e.id);
}
}
}
cout<<"Scenario #"<<j<<":\n"<<ans<<endl<<endl;
}
return 0;
}
测试数据并演示
1
5 7
1 2 7
1 3 2
1 4 15
2 3 9
2 5 4
3 5 10
4 5 3
小结
- 宽搜,贪心策略,Dijkstra算法。它从源节点开始,逐步扩展到其他节点,每次都选择距离源节点最近且尚未确定最短路径的节点,然后以该节点为中间点,更新其相邻节点到源节点的距离。通过不断重复这个过程,直到所有节点的最短路径都被确定。
- 更新原则:在出发城市的承重和出发城市到目标城市道路的承重中选择最小值,再跟目标城市的承重比较,用其中最大值更新目标城市承重。