这道题数据范围小,方法比较多。我用floyd和spfa分别写了一下,spfa明显有时间优势。

一个小技巧在于:把城市名称对应到数字序号,处理是用数字。

方法一:spfa

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define pii pair<int,int>
#define LL long long int
const int eps=1e-;
const int INF=;
const int maxn=+;
int n,r,cas=,ton,num,used[maxn],d[maxn],m[maxn][maxn];
char city[maxn][];
char s[],e[];
vector<int>v[maxn];
int index(char *ss)
{
int i;
for(i=;i<num;i++)
{
if(strcmp(ss,city[i])==)
{
return i;
}
}
strcpy(city[num++],ss);
return i;
}
void ini()
{
num=;
for(int i=;i<n;i++)
{
strcpy(city[i],"\0");
v[i].clear();
used[i]=;
d[i]=INF;
}
}
int spfa(int s,int e)
{
queue<int>q;
q.push(s);
used[s]=;
while(!q.empty())
{
int t=q.front();
used[t]=;
q.pop();
int siz=v[t].size();
for(int i=;i<siz;i++)
{
int k=v[t][i];
/*if(used[k]==0) {q.push(k);used[k]=1;}
if(d[k]<INF) d[k]=max(d[k],min(d[t],m[t][k]));
else d[k]=min(d[t],m[t][k]);*/
/*上面注释掉的这种写法不对,一旦有环就会陷入死循环(即使这题不会有
负边)。还是对spfa理解的不够。需要更新的点才要考虑入队的问题,不需要
更新的点肯定不入队,最后所有点都不用再更新了队列为空退出循环。而不是
遇到一个点就入队。*/
if(d[k]==INF)
{
d[k]=min(d[t],m[t][k]);
q.push(k);used[k]=;
}
else if(min(d[t],m[t][k])>d[k])
{
d[k]=min(d[t],m[t][k]);
if(used[k]==) {q.push(k);used[k]=;}
}
}
}
return d[e];
}
int main()
{
//freopen("in8.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d%d",&n,&r)==)
{
if(n==&&r==) break;
printf("Scenario #%d\n",++cas);
ini();
for(int i=;i<r;i++)
{
scanf("%s%s%d",s,e,&ton);
int t1=index(s);
int t2=index(e);
v[t1].push_back(t2);
v[t2].push_back(t1);
m[t1][t2]=m[t2][t1]=ton;
}
scanf("%s%s",s,e);
int t1=index(s);
int t2=index(e);
printf("%d tons\n",spfa(t1,t2));
printf("\n");
}
//fclose(stdin);
//fclose(stdout);
return ;
}

spfa

方法二:floyd

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<algorithm>
#include<stack>
#include<queue>
#include<cctype>
#include<sstream>
using namespace std;
#define pii pair<int,int>
#define LL long long int
const int eps=1e-;
const int INF=;
const int maxn=+;
int n,r,m[maxn][maxn],cas=,ton,num;
char city[maxn][];
char s[],e[];
int index(char *ss)
{
int i;
for(i=;i<num;i++)
{
if(strcmp(ss,city[i])==)
{
return i;
}
}
strcpy(city[num++],ss);
return i;
}
void floyd()
{
for(int k=;k<n;k++)
{
for(int i=;i<n;i++)
{
for(int j=;j<n;j++)
{
m[i][j]=max(m[i][j],min(m[i][k],m[k][j]));
}
}
}
}
void ini()
{
num=;
for(int i=;i<n;i++)
{
strcpy(city[i],"\0");
for(int j=;j<n;j++)
{
if(i==j) m[i][j]=INF;
else m[i][j]=;
}
}
}
int main()
{
//freopen("in8.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d%d",&n,&r)==)
{
if(n==&&r==) break;
printf("Scenario #%d\n",++cas);
ini();
for(int i=;i<r;i++)
{
scanf("%s%s%d",s,e,&ton);
int t1=index(s);
int t2=index(e);
m[t1][t2]=m[t2][t1]=ton;
}
floyd();
scanf("%s%s",s,e);
int t1=index(s);
int t2=index(e);
printf("%d tons\n",m[t1][t2]);
printf("\n");
}
//fclose(stdin);
//fclose(stdout);
return ;
}

floyd

poj2263 zoj1952 Heavy Cargo(floyd||spfa)的更多相关文章

  1. POJ2263 Heavy Cargo

    Heavy Cargo Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4004   Accepted: 2124 Descr ...

  2. POJ 2263 Heavy Cargo(Floyd + map)

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

  3. ACM/ICPC 之 最短路-Floyd+SPFA(BFS)+DP(ZOJ1232)

    这是一道非常好的题目,融合了很多知识点. ZOJ1232-Adventrue of Super Mario 这一题折磨我挺长时间的,不过最后做出来非常开心啊,哇咔咔咔 题意就不累述了,注释有写,难点在 ...

  4. Heavy Cargo POJ 2263 (Floyd传递闭包)

    Description Big Johnsson Trucks Inc. is a company specialized in manufacturing big trucks. Their lat ...

  5. poj 1847( floyd && spfa )

    http://poj.org/problem?id=1847 一个水题,用来熟悉熟悉spfa和floyd的. 题意:有m条的铁路,要从x,到y, 之后分别就是条铁路与其他铁路的交点.第一个输入的为有n ...

  6. K - Heavy Cargo dijkstar

    来源poj2263 Big Johnsson Trucks Inc. is a company specialized in manufacturing big trucks. Their lates ...

  7. poj1847 Tram(Dijkstra || Floyd || SPFA)

    题目链接 http://poj.org/problem?id=1847 题意 有n个车站,编号1~n,每个车站有k个出口,车站的出口默认是k个出口中的第一个,如果不想从默认出口出站,则需要手动选择出站 ...

  8. hdoj2544 最短路(Dijkstra || Floyd || SPFA)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2544 思路 最短路算法模板题,求解使用的Dijkstra算法.Floyd算法.SPFA算法可以当做求解 ...

  9. [APIO2017]商旅——分数优化+floyd+SPFA判负环+二分答案

    题目链接: [APIO2017]商旅 枚举任意两个点$(s,t)$,求出在$s$买入一个物品并在$t$卖出的最大收益. 新建一条从$s$到$t$的边,边权为最大收益,长度为原图从$s$到$t$的最短路 ...

随机推荐

  1. mysql数据库补充知识7 索引原理与慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  2. Centos 常用系统命令

    一.查看系统硬件信息: 1.CPU # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 c ...

  3. 十位用户唯一ID生成策略

    新浪微博和twitter 等系统都有一窜数字ID来标示一个唯一的用户,这篇文章就是记录如何实现这种唯一数字ID 原理:使用MYSQL 自增ID 拼接任意字符..然后使用进制转换打乱规则 一般来说实现唯 ...

  4. AJAX实现三级联动

    省市区三级联动插件: 主页面:为方便使用,不用写过多代码,只写一个id为sanji的div,若别的页面要用,只需写一个id为sanji的div,加载上jQuery与sanji.js文件即可 <! ...

  5. 面对 to B 业务该如何构建研发管理体系?

    未来离我们越来越近,而过去并未走远,我们发现科技公司2B业务兴起,腾讯认为互联网下半场属于产业互联网,需要进行一次重要的战略升级.它们在国庆节最后一天进行新一轮组织架构调整,最亮眼的就是新成立云与智慧 ...

  6. excel中如何取消自动超链接?

    最近做的表格有点多,年终述职也到了.总有一些地方生疏了,幸好还有点小印象.记录下来,以后可以回来看看. 方法一 适合单个链接的取消 1 输入网址后,按回车键确认,快捷键ctrl+z,即可取消,这种不好 ...

  7. Linux Shell基础 多个命令中的分号(;)、与(&&) 、 或(||)

    概述 在 Bash 中,如果需要让多条命令按顺序执行,则有这样方法,如表 1 所示. 多命令执行符 格 式 作 用 : 命令1 ; 命令2 多条命令顺序执行,命令之间没有任何逻辑关系 &&am ...

  8. Sublime text3装入插件Anaconda

    好多人在学习编写代码的时候,会有不同的编辑器,大神们建议我使sublime,但是我在里面写代码,没有一点提示,我的天,不得烧坏我的脑子啊.学Python我用的Ananconda,但是这个spyder有 ...

  9. Kubernetes busybox nslookup问题

    使用最新版本的busybox会出现nslookup提示无法解析的问题: Server: 10.96.0.10 Address: 10.96.0.10:53 ** server can't find k ...

  10. kubernetes liveness readiness

    Liveness Probe(存活探针):用于判断容器是否存货(running状态),如果LivenessProbe探测到容器不健康,则kubelet将杀掉该容器,并根据容器的重启策略做相应的处理.如 ...