ACM/ICPC 之 两道dijkstra练习题(ZOJ1053(POJ1122)-ZOJ1053)
两道较为典型的单源最短路径问题,采用dijkstra解法
本来是四道练习题,后来发现后面两道用dijkstra来解的话总觉得有点冗余了,因此暂且分成三篇博客(本篇以及后两篇)。
ZOJ1053(POJ1122)-FDNY to the Rescue!
//POJ1122-ZOJ1053
//dijkstra-需要记录路径
//给出n个路口的邻接矩阵,求给定多个火警到失火点的时间及任一路径
//注意输入最后一行时,cin.getline需要两次,猜测需要接受邻接矩阵最后一行其他字符后再接受下一行(有误请指出)
//POJ1122:Time:16Ms Memory:208K (单组数据)
//ZOJ1053:Time:0Ms Memory:276K (多组数据,中间空一行)
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std; #define MAX 21
#define INF 0x3f3f3f3f struct FD { //FDNY
int d; //到失火点的距离
int num; //FD编号
friend bool operator < (FD fd1, FD fd2) { return fd1.d < fd2.d; }
}fd[MAX]; int n;
int road[MAX][MAX]; //有向图-road[i][j]:从i到j的距离
int d[MAX];
int fa[MAX];
bool v[MAX]; void dijkstra(int x)
{
memset(v, false, sizeof(v));
v[x] = true;
for (int i = ; i <= n; i++)
{
d[i] = road[i][x];
fa[i] = x;
}
for (int i = ; i <= n; i++)
{
int mind = INF;
int k;
for (int j = ; j <= n; j++)
if (!v[j] && mind > d[j])
{
mind = d[j];
k = j;
}
if (mind == INF) return;
v[k] = true;
for (int j = ; j <= n; j++)
if (!v[j] && d[j] > d[k] + road[j][k])
{
d[j] = d[k] + road[j][k];
fa[j] = k;
}
}
} int main()
{
int T;
scanf("%d", &T);
char str[*MAX];
cin.getline(str,*MAX);
while (T--)
{
scanf("%d", &n);
for (int i = ; i <= n; i++)
for (int j = ; j <= n; j++)
{
scanf("%d", &road[i][j]);
if (road[i][j] == -) road[i][j] = INF;
}
cin.getline(str, * MAX);
cin.getline(str, * MAX); dijkstra(str[] - '');
printf("Org\tDest\tTime\tPath\n");
int lenfd = ;
int len = strlen(str);
for (int i = ; i < len; i += )
{
fd[lenfd].num = str[i] - '';
fd[lenfd++].d = d[str[i] - ''];
} sort(fd, fd + lenfd);
for (int i = ; i < lenfd; i++)
{
printf("%d\t%d\t%d\t%d", fd[i].num, str[] - '', fd[i].d, fd[i].num);
int x = fd[i].num;
while (fa[x] != x)
printf("\t%d", x = fa[x]);
printf("\n");
}
if(T) printf("\n");
}
return ;
}
ZOJ1053-Transport Goods
//dijkstra-松弛变形
//题意中的cost请理解为Goods的代价(即消耗Goods的比例),可以比作路上会因各种情况损失货物的比例
//博主用的是普通的最短路,不过WA了好几发,初始化-去重-松弛处理都有过问题(做了几个小时啊...)
//可以转化为最长路,精度比博主会更好,不过针对此题并无必要
//Time:0Ms Memory:360K
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; #define MAX 105
#define INF 0x7f7f7f7f int n, m;
double cost[MAX][MAX];
double d[MAX], w[MAX];
bool v[MAX]; void dijkstra()
{
memset(v, false, sizeof(v));
v[n] = true;
for (int i = ; i < n; i++)
d[i] = cost[i][n];
for (int i = ; i <= n; i++)
{
double mind = ; //以1为上界
int k;
for (int j = ; j < n; j++)
{
if (!v[j] && mind > d[j])
{
mind = d[j];
k = j;
}
}
if (mind > ) return;
v[k] = true;
for (int j = ; j < n; j++) //松弛
if (!v[j] && cost[k][j] < && d[j] > - ( - d[k]) * ( - cost[k][j]))
d[j] = - ( - d[k]) * ( - cost[k][j]);
}
} int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
while (scanf("%d%d", &n, &m) != EOF)
{
memset(cost, INF, sizeof(cost));
memset(w, , sizeof(w));
for (int i = ; i < n; i++)
scanf("%lf", &w[i]);
for (int j = ; j < m; j++)
{
int x, y;
double r;
scanf("%d%d%lf", &x, &y, &r);
if (cost[x][y] > r) //去重
cost[y][x] = cost[x][y] = r;
}
dijkstra();
for (int i = ; i < n; i++)
if (d[i] < )
w[n] += ( - d[i]) * w[i];
printf("%.2f\n", w[n]);
}
return ;
}
ACM/ICPC 之 两道dijkstra练习题(ZOJ1053(POJ1122)-ZOJ1053)的更多相关文章
- ACM/ICPC 之 四道MST-Kruskal解法-练习题(POJ1251-POJ1287-POJ2031-POJ2421)
由于题目简单,部分题意写在代码中(简单题就应该多练英文...),且较少给注释,需要注意的地方会写在代码中,虽然四个题意各有千秋,但万变不离其宗,细细思考一番会发现四道题都属于很直接的最小生成树问题,由 ...
- ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)
两道有关欧拉回路的例题 POJ1300-Door Man //判定是否存在从某点到0点的欧拉回路 //Time:0Ms Memory:116K #include<iostream> #in ...
- ACM/ICPC 之 Floyd范例两道(POJ2570-POJ2263)
两道以Floyd算法为解法的范例,第二题如果数据量较大,须采用其他解法 POJ2570-Fiber Network //经典的传递闭包问题,由于只有26个公司可以采用二进制存储 //Time:141M ...
- ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)
两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...
- ACM/ICPC 之 最短路径-dijkstra范例(ZOJ2750-POJ1135(ZOJ1298))
最短路经典算法-dijkstra范例(两道),第一道是裸的dijkstra,第二道需要枚举所有边已找到可能的情况. ZOJ2750-Idiomatic Phrases Game 题意:见Code 题解 ...
- 『ACM C++』Virtual Judge | 两道基础题 - The Architect Omar && Malek and Summer Semester
这几天一直在宿舍跑PY模型,学校的ACM寒假集训我也没去成,来学校的时候已经18号了,突然加进去也就上一天然后排位赛了,没学什么就去打怕是要被虐成渣,今天开学前一天,看到最后有一场大的排位赛,就上去试 ...
- ACM - ICPC World Finals 2013 C Surely You Congest
原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...
- 【转】lonekight@xmu·ACM/ICPC 回忆录
转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...
- 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)
队名:Unlimited Code Works(无尽编码) 队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...
随机推荐
- iOS- Could not find a storyboard named 'Main' in bundle NSBundle
1.删掉工程中main.storyboard 后要删除plist文件中对应的键值,否则会报如下错误: Could not find a storyboard named 'Main' in bundl ...
- centos 安装 mysql5.7.9初始密码问题
mysql5.7.9在安装完成后会,root用户会产生一个不为空的初始密码,登陆mysql就会产生问题了,有必要修改一下登陆密码: 这是从网上找的一个方法,加以总结得出来的,亲测可以:# /etc/i ...
- clang
1.安装 clang 可以从官网下载,如果是CentOS 6 系统,也可以在 /etc/yum.repos.d/ 目录下增加一个 epel.repo 文件,内容如下: [epel] name=Extr ...
- html5手机常见问题与工具分享
mobileTech A useful tools or tips list for mobile web application developing 这个项目收集移动端开发所需要的一些资源与小技巧 ...
- 看开源代码利器—用Graphviz + CodeViz生成C/C++函数调用图(call graph)
一.Graphviz + CodeViz简单介绍 CodeViz是<Understanding The Linux Virtual Memory Manager>的作者 Mel Gorma ...
- PHP支付宝接口RSA验证
这两天一直困扰的PHP RSA签名验证问题终于解决了,由于之前RSA接触的不多,再加上官方至今还未有PHP的SDK可供参考,因此走了一些弯路,写在这里和大家分享. 虽然支付宝官方还未提供相关SD ...
- [译]git log
git log git log命令用来显示提交的快照. 能列出来你项目的历史, 能过滤和搜索你指定的一些修改. git status能让你检查工作目录和stage区的状态, git log只提供被co ...
- 【翻译】Tomcat 6.0 部署与发布
本篇参考Tomcat官方文档:<First Webapp>翻译,并结合自己的开发经验介绍关于tomcat部署以及发布的相关内容. 1 目录结构 在tomcat中所有的应用都是放置在CATA ...
- glusterFS的常用命令 (转)
1. 启动/关闭/查看glusterd服务 # /etc/init.d/glusterd start # /etc/init.d/glusterd stop # /etc/init.d/g ...
- etcd
https://github.com/silenceper/dcmp http://studygolang.com/topics/1866