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,参加今年区域赛之 ...
随机推荐
- Nginx中的rewrite指令
转自:http://www.76ku.cn/articles/archives/317 rewite.在server块下,会优先执行rewrite部分,然后才会去匹配location块server中的 ...
- ExtJS -- Grid 文本居中显示
Reference: http://stackoverflow.com/questions/6561120/extjs-4-apply-defaults-to-all-columns-in-a-gri ...
- 一行代码解决各种IE兼容问题IE8,IE9,IE10
一:一.指定文件兼容性模式(Xee:因为我已经放弃IE6,7了,所以以后设计的网页最低支持IE8;) 要为你的网页指定文件模式,需要在你的网页中使用meta元素放入X-UA-Compatible ht ...
- 更改vs自带的模板
路径:C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\ItemTemplatesCache\CSharp\Code\20 ...
- <a>标签跳转传值。
<a href="public_html/app/Tpl/song_1/inc/{url r="deal#support" p="id=$deal_inf ...
- 如何禁用wordpress的RSS Feed
RSS(Really Simple Syndication)是一种描述和同步网站内容的格式,早期使用RSS订阅能更快地获取信息,网站提供RSS输出,有利于让用户获取网站内容的最新更新.但随着采集技术的 ...
- Hadoop 之Impala
impala 是基于hive的大数据实时分析查询引擎,直接使用Hive的元数据库metadata意味着impala元数据都存储在hive的metadstore中并且impala兼容hive的 sql解 ...
- C#GDI+图像处理
支持格式:BMP.GIF.JPEG.EXIF.PNG.TIFF.ICON.WMF.EMF等,几乎涵盖所有常用格式 图像类: Image类:Bitmap和Metafile的类提供功能的抽象基类. Met ...
- 关于phpcms中mysql和mysqli的区别
用phpcms开发一个考试成绩查询的小模块,用电脑上以前下载的phpcms版本为框架开发,一切顺利.想着下载一个最新版本,以后也免了升级的麻烦.于是,下载好,然后把模块目录.model数据库连接文件. ...
- 9 patch png 的上下左右
9 patch png 的上下左右 前言: 9 patch png 图片,扩展名为.9.png,是一个标准的PNG图像,它包括额外的1个像素的边界,通过对这个边界的描述来达到我们预期的拉伸效果.a ...