题目链接:

https://vjudge.net/problem/POJ-2263

题目大意:

有n个城市,m条连接两个城市的道路,每条道路有自己的最大复载量。现在问从城市a到城市b,车上的最大载重能为多少。

思路:

这里求的不是最短路,求的是最大容量路,意思就是每条路的最小边就是这条路的容量值,要求出最大的容量值。可以用Floyd的思想来求解。设Map[i][j]表示从i到j的容量值,递推方程变成:

Map[i][j] = MAX{ Map[i][j],  MIN{ Map[i][k],  Map[k][j] } 。这里需要好好的思考一下,对于点i和点j,中间点的加入更改的递推式应该取最大值,因为求的就是最大的容量值,而对于新加进来的i-k和k-j必须取小的值,因为小的值才是这条路的容量值,三重循环遍历之后就求出了每两点之间的最大容量值。注意初始化的时候Map应该都为0,因为求的是最大值

其实Dijkstra和Bellman算法也可以求解,同样的松弛方程改成上述含义就可以。

拓展:POJ2253最大边的最小值,思路一样,方程正好相反

Floyd:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<sstream>
#define MEM(a, b) memset(a, b, sizeof(a));
using namespace std;
typedef long long ll;
const int maxn = + ;
const int INF = 0x3f3f3f3f;
int T, n, m, cases, tot;
int Map[maxn][maxn];
map<string, int>id;
set<string>cnt;
int getid(string s)
{
if(cnt.count(s))return id[s];
cnt.insert(s);
return id[s] = cnt.size();
}
int main()
{
while(cin >> n >> m && (n + m))
{
string s1, s2;
int d;
cnt.clear();
id.clear();
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)Map[i][j] = ;
}
for(int i = ; i < m; i++)
{
cin >> s1 >> s2 >> d;
int u = getid(s1);
int v = getid(s2);
//cout<<u<<" "<<v<<endl;
Map[v][u] = Map[u][v] = d;
}
cin >> s1 >> s2;
for(int k = ; k <= n; k++)
{
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)
{
Map[i][j] = max(Map[i][j], min(Map[i][k], Map[j][k]));
}
}
}
int u = getid(s1);
int v = getid(s2);
printf("Scenario #%d\n", ++cases);
printf("%d tons\n\n", Map[u][v]);
}
return ;
}

dijkstra:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#include<sstream>
#define MEM(a, b) memset(a, b, sizeof(a));
using namespace std;
typedef long long ll;
const int maxn = + ;
const int INF = 0x3f3f3f3f;
int T, n, m, cases, tot;
int Map[maxn][maxn];
map<string, int>id;
set<string>cnt;
int d[maxn];
bool v[maxn];
void dijkstra(int u)
{
MEM(v, );
MEM(d, );
d[u] = INF;
for(int i = ; i < n; i++)
{
int x, m = ;//求距离最远的加入
for(int i = ; i <= n; i++)if(!v[i] && d[i] >= m)m = d[x = i];//找到最大的标记
v[x] = ;
//cout<<m<<endl;
for(int i = ; i <= n; i++)d[i] = max(d[i], min(d[x], Map[x][i]));
}
}
int getid(string s)
{
if(cnt.count(s))return id[s];
cnt.insert(s);
return id[s] = cnt.size();
}
int main()
{
while(cin >> n >> m && (n + m))
{
string s1, s2;
int w;
cnt.clear();
id.clear();
for(int i = ; i <= n; i++)
{
for(int j = ; j <= n; j++)Map[i][j] = ;
}
for(int i = ; i < m; i++)
{
cin >> s1 >> s2 >> w;
int u = getid(s1);
int v = getid(s2);
//cout<<u<<" "<<v<<endl;
Map[v][u] = Map[u][v] = w;
}
cin >> s1 >> s2;
int u = getid(s1);
int v = getid(s2);
dijkstra(u);
printf("Scenario #%d\n", ++cases);
printf("%d tons\n\n", d[v]);
}
return ;
}

POJ-2263 Heavy Cargo---最短路变形&&最小边的最大值的更多相关文章

  1. POJ 2263 Heavy Cargo(Floyd + map)

    Heavy Cargo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3768   Accepted: 2013 Descr ...

  2. POJ 2263 Heavy Cargo(ZOJ 1952)

    最短路变形或最大生成树变形. 问 目标两地之间能通过的小重量. 用最短路把初始赋为INF.其它为0.然后找 dis[v]=min(dis[u], d); 生成树就是把最大生成树找出来.直到出发和终点能 ...

  3. POJ 1797 Heavy Transprotation ( 最短路变形 || 最小生成树 )

    题意 : 找出 1 到 N 点的所有路径当中拥有最大承载量的一条路,输出这个最大承载量!而每一条路的最大承载量由拥有最大承载量的那一条边决定 分析 : 与 POJ 2253 相似且求的东西正好相反,属 ...

  4. POJ 1797 Heavy Transportation 最短路变形(dijkstra算法)

    题目:click here 题意: 有n个城市,m条道路,在每条道路上有一个承载量,现在要求从1到n城市最大承载量,而最大承载量就是从城市1到城市n所有通路上的最大承载量.分析: 其实这个求最大边可以 ...

  5. POJ 2263 Heavy Cargo 多种解法

    好题.这题可以有三种解法:1.Dijkstra   2.优先队列   3.并查集 我这里是优先队列的实现,以后有时间再用另两种方法做做..方法就是每次都选当前节点所连的权值最大的边,然后BFS搜索. ...

  6. POJ 3635 - Full Tank? - [最短路变形][手写二叉堆优化Dijkstra][配对堆优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 题意题解等均参考:POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]. 一些口胡: ...

  7. POJ 3635 - Full Tank? - [最短路变形][优先队列优化Dijkstra]

    题目链接:http://poj.org/problem?id=3635 Description After going through the receipts from your car trip ...

  8. POJ 2253 Frogger【最短路变形——路径上最小的最大权】

    链接: http://poj.org/problem?id=2253 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22010#probl ...

  9. POJ 1797 Heavy Transportation(Dijkstra变形——最长路径最小权值)

    题目链接: http://poj.org/problem?id=1797 Background Hugo Heavy is happy. After the breakdown of the Carg ...

随机推荐

  1. 1-2 hibernate主配置文件hibernate.cfg.xml详解

    详 http://www.cnblogs.com/biehongli/p/6531575.html Hibernate的主配置文件hibernate.cfg.xml 1:Hibernate的主配置文件 ...

  2. Vue解析一之挂载全局变量与方法

    1.在mian.js里面进行Vue对象的原型连的挂载Vue.prototype.$ajax = Ajax; 2.使用Mixin: VuVue.mixin({ data(){ return { Host ...

  3. MYSQL数据库学习六 索引的操作

    6.1 索引 由于数据存储在数据库表中,所以索引是创建在数据库表对象上的,由表中的一个或多个字段生成的键组成,这些键存储在数据结构(B-树或哈希表)中,通过索引可以快速有效地查找与键值相关联的字段.根 ...

  4. java之简单工厂模式详解

    设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了可重用代码.让代码更容易被他人理解.保证代码可靠性. 毫无疑问,设计模式于 ...

  5. LeetCode --> 771. Jewels and Stones

    Jewels and Stones You're given strings J representing the types of stones that are jewels, and S rep ...

  6. Linux运维人员共用root帐户权限审计(转至马哥Linux运维)

    一.应用场景 在中小型企业,公司不同运维人员基本都是以root 账户进行服务器的登陆管理,缺少了账户权限审计制度.不出问题还好, 出了问题,就很难找出源头.这里介绍下,如何利用编译bash 使不同的客 ...

  7. Idea  调试代码

    ---恢复内容开始--- set DEBUG_PORT=8787 set JAVA_DEBUG=-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,addr ...

  8. curl的使用基本流程,HTTP的get请求,post请求

    使用CURL的PHP扩展完成一个HTTP请求的发送一般有以下几个步骤: 1.初始化连接句柄: 2.设置CURL选项: 3.执行并获取结果: 4.释放VURL连接句柄. 下面的程序片段是使用CURL发送 ...

  9. C#之字符串

    1 Replace string sayHello = "Hello World!"; Console.WriteLine(sayHello); sayHello = sayHel ...

  10. Linux下的指令:tail

    tail指令常用来查看服务器中的日志信息. 有的时候,需要实时获取日志信息. 比如,我们向服务器发送了一个请求,此时日志有更新,而我们又想实时看到尾部更新的内容. 这时候可以使用指令: tail -f ...