两道较为典型的单源最短路径问题,采用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)的更多相关文章

  1. ACM/ICPC 之 四道MST-Kruskal解法-练习题(POJ1251-POJ1287-POJ2031-POJ2421)

    由于题目简单,部分题意写在代码中(简单题就应该多练英文...),且较少给注释,需要注意的地方会写在代码中,虽然四个题意各有千秋,但万变不离其宗,细细思考一番会发现四道题都属于很直接的最小生成树问题,由 ...

  2. ACM/ICPC 之 欧拉回路两道(POJ1300-POJ1386)

    两道有关欧拉回路的例题 POJ1300-Door Man //判定是否存在从某点到0点的欧拉回路 //Time:0Ms Memory:116K #include<iostream> #in ...

  3. ACM/ICPC 之 Floyd范例两道(POJ2570-POJ2263)

    两道以Floyd算法为解法的范例,第二题如果数据量较大,须采用其他解法 POJ2570-Fiber Network //经典的传递闭包问题,由于只有26个公司可以采用二进制存储 //Time:141M ...

  4. ACM/ICPC 之 SPFA范例两道(POJ3268-POJ3259)

    两道以SPFA算法求解的最短路问题,比较水,第二题需要掌握如何判断负权值回路. POJ3268-Silver Cow Party //计算正逆最短路径之和的最大值 //Time:32Ms Memory ...

  5. ACM/ICPC 之 最短路径-dijkstra范例(ZOJ2750-POJ1135(ZOJ1298))

    最短路经典算法-dijkstra范例(两道),第一道是裸的dijkstra,第二道需要枚举所有边已找到可能的情况. ZOJ2750-Idiomatic Phrases Game 题意:见Code 题解 ...

  6. 『ACM C++』Virtual Judge | 两道基础题 - The Architect Omar && Malek and Summer Semester

    这几天一直在宿舍跑PY模型,学校的ACM寒假集训我也没去成,来学校的时候已经18号了,突然加进去也就上一天然后排位赛了,没学什么就去打怕是要被虐成渣,今天开学前一天,看到最后有一场大的排位赛,就上去试 ...

  7. ACM - ICPC World Finals 2013 C Surely You Congest

    原题下载:http://icpc.baylor.edu/download/worldfinals/problems/icpc2013.pdf 题目翻译: 试题来源 ACM/ICPC World Fin ...

  8. 【转】lonekight@xmu·ACM/ICPC 回忆录

    转自:http://hi.baidu.com/ordeder/item/2a342a7fe7cb9e336dc37c89 2009年09月06日 星期日 21:55 初识ACM最早听说ACM/ICPC ...

  9. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

随机推荐

  1. [c#]获取exchange中的图片

    摘要 在exchange 2007或者2010中获取的邮件内容为html标签格式,也就是一个页面.如果里面含有img标签,你会发现img标签的src属性为cid:xxxxxxxxxxxx的一串字符串, ...

  2. 我的linux桌面

    经过几次尝试安装linux系统之后,终于把自己的系统安装成了linux系统. wangkongming@ThinkPad-T410 ~ $ lsb_release -a No LSB modules ...

  3. jQuery回调、递延对象总结(上篇)—— jQuery.Callbacks

    前言: 作为参数传递给另一个函数执行的函数我们称为回调函数,那么该回调又是否是异步的呢,何谓异步,如:作为事件处理器,或作为参数传递给 (setTimeout,setInterval)这样的异步函数, ...

  4. VTK初学一,a Mesh from vtkImageData

    #ifndef INITIAL_OPENGL #define INITIAL_OPENGL #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRend ...

  5. 清北学堂模拟day6 花

    [问题描述] 商店里出售n种不同品种的花.为了装饰桌面,你打算买m支花回家.你觉得放两支一样的花很难看,因此每种品种的花最多买1支.求总共有几种不同的买花的方案?答案可能很大,输出答案mod p的值. ...

  6. C++实现对lua访问的封装

    这是一个几年前写的对lua的访问封装,当时的项目仅提供了最基本的lua访问接口:调用lua函数,向lua注册标准格式的C++函数. 本来我想引进luabind,但luabind相对又过于复杂,并不是所 ...

  7. loadrunner-27796错误寻求解决办法

    Action.c(58): Error -27796: Failed to connect to server "www.baidu.com:80": [10048] Addres ...

  8. jekyll 安装过程

    如果有, linux以源码包方式发布, 方便,快捷, 容易出错,安装内容难找到,版本容易冲突.兼容性会出错.如何解决这种方式:1.上网查找答案,你遇到的别人也有,关键词匹配到,好像没有别的办法解决了, ...

  9. 怎样用路由器共享需要网页认证的wifi

    设置步骤:第一步:登录管理界面 1.连接电脑使用单机能上网的电脑,通过网线连接到路由器的LAN口.2.登录管理界面打开电脑的浏览器,清空地址栏后,输入路由器的管理地址(以路由器底部标贴标识的管理地址为 ...

  10. java历史

    1.产生: 1990年初sun公司James Gosling等员工开发java语言的雏形,最初被命名为Oak,定位于家用电器的控制和通讯,随后因为市场的需求,公司放弃计划,后面由于Internet的发 ...