POJ 1797 Heavy Transportation (最短路)
| Time Limit: 3000MS | Memory Limit: 30000K | |
| Total Submissions: 22440 | Accepted: 5950 |
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 这题对我来说太经典了,估计我整个ICPC生涯都不会忘了这题。因为做过类似的题,所以刚开始就推出了转移方程,即D[i]保存以i为终点的所有路径上最小载重值最大的点,更新方程就是if D[i] < min(D[s],COST[s][i]) then D[i] = min(D[i] + COST[s][i]).我用dijkstra来做,但是WA了,无奈上网看了看,发现方程是对的,于是又用bellman写了一遍,果然A了。于是我就怀疑是不是我dijkstra理解搓了,果断找出MIT的公开课又学了一遍,发现理解是对的,顺便学会了对S的证明,此题可证出加入S的点已经正确。然后就开始了为期两天的DEBUG工程,调得快崩溃了,证了无数遍改了无数遍,终于在今天跑出了一组错误的数据。最后发现,问题出在优先队列上。
我优先队列里保存的是顶点的编号,然后通过比较D值来维护。于是,就在这里,出现了一个惊天地泣鬼神的错误。如果顶点2被加入到了队列里,并且此时的D值等于10,那么当它后来再次被更新以后,比如D值更新到了8,此时再次push的话,是push不进去的!队列会认为此元素已经存在,所以不做任何反应,虽然它的键值已经改变!网上一查果然有人遇到了同样的问题,他描述的比我清楚,传送门http://bbs.byr.cn/#!article/ACM_ICPC/8739?p=1 ,里面的第二个例子。我后来采用了3楼的办法,同时保存顶点号与D值,这样即使顶点号相同,但D值不同的话依然可以入队。
顺便一说,前面几题我用的是保存顶点的方法,所以虽然A了但是其实是错的。
印象实在太深了,这是我调试得最深入的一题,记录留念!
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
using namespace std; const int INF = 0x6fffffff;
const int SIZE = ;
int N;
int D[SIZE];
bool S[SIZE]; struct NNode
{
int pos,dis;
bool operator <(const NNode & r) const
{
return dis < r.dis;
};
};
struct Node
{
int vec,cost;
};
vector<Node> G[SIZE]; void Dijkstra(int);
int main(void)
{
//freopen("out.txt","r",stdin);
//freopen("2.txt","w",stdout);
int n,m,from;
int count = ;
Node temp; scanf("%d",&n);
while(n --)
{
scanf("%d%d",&N,&m);
for(int i = ;i <= N;i ++)
G[i].clear();
while(m --)
{
scanf("%d%d%d",&from,&temp.vec,&temp.cost);
G[from].push_back(temp);
swap(from,temp.vec);
G[from].push_back(temp);
}
Dijkstra();
printf("Scenario #%d:\n",++ count);
printf("%d\n\n",D[N]); } return ;
} void Dijkstra(int s)
{
NNode temp; priority_queue<NNode> que;
fill(S,S + SIZE,false);
fill(D,D + SIZE,);
D[s] = INF;
temp.pos = s;
temp.dis = INF;
que.push(temp); while(!que.empty())
{
NNode cur = que.top();
que.pop();
S[cur.pos] = true;
if(cur.pos == N)
break; for(int i = ;i < G[cur.pos].size();i ++)
if(!S[G[cur.pos][i].vec] && D[G[cur.pos][i].vec] < min(D[cur.pos],G[cur.pos][i].cost))
{
D[G[cur.pos][i].vec] = min(D[cur.pos],G[cur.pos][i].cost);
temp.pos = G[cur.pos][i].vec;
temp.dis = D[G[cur.pos][i].vec];
que.push(temp); //如果只保存顶点号的话会出错
}
}
}
Dijkstra
#include <iostream>
#include <cstdio>
using namespace std; const int INF = 0x6fffffff;
const int SIZE = ;
struct Node
{
int from,to,cost;
}G[SIZE * SIZE];
int N,M;
int D[SIZE]; void Bellman_ford(int);
int main(void)
{
int n,m;
int count = ; scanf("%d",&n);
while(n --)
{
scanf("%d%d",&N,&M);
int temp = M;
int i = ;
while(temp --)
{
scanf("%d%d%d",&G[i].from,&G[i].to,&G[i].cost);
i ++;
G[i].from = G[i - ].to;
G[i].to = G[i - ].from;
G[i].cost = G[i - ].cost;
i ++;
}
Bellman_ford();
printf("Scenario #%d:\n",++ count);
printf("%d\n\n",D[N]);
} return ;
} void Bellman_ford(int s)
{
fill(D,D + SIZE,);
D[s] = INF;
for(int j = ;j < N - ;j ++)
{
bool update = false;
for(int i = ;i < M * ;i ++)
if(D[G[i].to] < min(D[G[i].from],G[i].cost))
{
D[G[i].to] = min(D[G[i].from],G[i].cost);
update = true;
}
if(!update)
break;
}
}
Bellman_Ford
POJ 1797 Heavy Transportation (最短路)的更多相关文章
- POJ 1797 Heavy Transportation 最短路变形(dijkstra算法)
题目:click here 题意: 有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量.分析: 其实这个求最大边可以 ...
- poj 1797 Heavy Transportation(最大生成树)
poj 1797 Heavy Transportation Description Background Hugo Heavy is happy. After the breakdown of the ...
- POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径)
POJ 1797 Heavy Transportation / SCU 1819 Heavy Transportation (图论,最短路径) Description Background Hugo ...
- POJ.1797 Heavy Transportation (Dijkstra变形)
POJ.1797 Heavy Transportation (Dijkstra变形) 题意分析 给出n个点,m条边的城市网络,其中 x y d 代表由x到y(或由y到x)的公路所能承受的最大重量为d, ...
- POJ 1797 Heavy Transportation
题目链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K T ...
- POJ 1797 Heavy Transportation SPFA变形
原题链接:http://poj.org/problem?id=1797 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K T ...
- POJ 1797 ——Heavy Transportation——————【最短路、Dijkstra、最短边最大化】
Heavy Transportation Time Limit:3000MS Memory Limit:30000KB 64bit IO Format:%I64d & %I64 ...
- POJ 1797 Heavy Transportation(最大生成树/最短路变形)
传送门 Heavy Transportation Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 31882 Accept ...
- POJ 1797 Heavy Transportation (Dijkstra变形)
F - Heavy Transportation Time Limit:3000MS Memory Limit:30000KB 64bit IO Format:%I64d & ...
随机推荐
- 行为类模式(一):职责链(Chain Of Responsibility)
定义 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系. 将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. UML 优点 将请求的发送者和接收者解耦 可以 ...
- 如何为C语言添加一个对象系统
为C语言添加OO能力的尝试从上世纪70年代到现在一直没有停止过,除了大获成的C++/Objective-C以外,还有很多其它的成功案例,比如GTK在libg中实现了一个对象系统,还有前几年一个OOC, ...
- Expression<Func<T,TResult>>和Func<T,TResult> 与AOP与WCF
1>>Expression<Func<T,TResult>>和Func<T,TResult>http://www.cnblogs.com/xcsn/p/ ...
- VC中常用的宏[转]
我们在VS环境中开发的时候,会遇到很多宏定义,这些宏可以应用到代码中,或用于编译.工程选项等设置,总之是我们开发中必不可少的工具,有必要做一个总结.有些宏是C/C++定义的,有些宏是VC环境预定义的. ...
- SoapUI命令行方式运行
http://stackoverflow.com/questions/9220132/soapui-groovy-script-calls-to-command-line SoapUI支持用命令行方式 ...
- List排序忽略大小写
public List<String> sortListIgnoreCase(List<String> list) { Collections.sort(list ...
- CMSIS Example - Mail and Timer
#include <stdint.h> #include "bsp-fifisdr.h" #include "lpclib.h" #include ...
- uC/OS-III学习2::uC/OS-III LED闪烁实验
1 前言: 看完了uC/OS-III的基本介绍之后,大致对这个操作系统有了点了解,但真正的理解还是要通过不断的去使用,在使用中体验uC/OS-III的乐趣和更深的理解其工作原理是非常重要的.因此,我在 ...
- IIS 7.0 and Web Farms
1. IIS 6 IIS 6.0 was capable of scaling out to virtually any number of web servers and had tools lik ...
- 学渣告诉你,到底神马是傅里叶级数!转自 新浪@工程师style