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 & ...
随机推荐
- 集成Jenkins Notifier for Chrome到Jenkins CI
Jenkins也算是现在最流行的CI工具了,我们team也使用它来做持续化集成的工作.最近需要增加弹出式窗口来提醒相关人员job的状态,故选择Jenkins Notifier for Chrome这个 ...
- css样式被覆盖解决方案
刚才写zenktodo的时候,通过动态添加class的方式修改一个div的样式,总是不起作用. #navigator { height: 100%; width: 200; position: abs ...
- reactor设计模式
reactor介绍 reactor的工作模式就像它的名字一样,是一种反射模式,当事件发生时,根据发生的事件调用注册的处理器. Reactor的优点和应用 Reactor最常用于非阻塞的socket 传 ...
- css初始化代码方案
(从已经死了一次又一次终于挂掉的百度空间人工抢救出来的,发表日期 2014-06-24) 为了消除各浏览器对css默认的设置,保持网页在各浏览器中的外观保持一致,初始化css就显得非常必要了!很多时候 ...
- xshell linux传文件
yum install lrzsz 安装完毕即可使用 rz,sz是便是Linux/Unix同Windows进行ZModem文件传输的命令行工具 windows端需要支持ZModem的telnet/s ...
- vs2010代码注释自动生成api文档
最近做了一些接口,提供其他人调用,要写个api文档,可是我想代码注释已经写了说明,能不能直接把代码注释生成api?于是找到以下方法 环境:vs2010 先下载安装Sandcastle 和Sandcas ...
- 转载 C++常用库函数atoi,itoa,strcpy,strcmp的实现
C++常用库函数atoi,itoa,strcpy,strcmp的实现 C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. ...
- 【android开发】Android防止内存溢出浅析
近期项目做得差点儿相同了,測试出现了一些问题,当中一个就是内存溢出问题,在三星手机上測试最easy出现内存溢出,在其它手机上,比方华为就没有发生,也是比較郁闷.这个问题在之前的公司,做项目时也遇到过, ...
- [Node.js] CommonJS Modules
CoomonJS modules provide a clean syntax for importing dependencies. This lesson will take a look at ...
- MySql之char与varchar
MySql之char与varchar的差别 char是一种固定长度的类型,varchar则是一种可变长度的类型.它们的差别是: 1. char(M)类型的数据列里.每一个值都占用M个字节.假设某个长 ...