两道较为典型的单源最短路径问题,采用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. Autolayout学习(1)-了解Autoreszing

    1. 为什么要有Autoreszing? 在Xcode6之前,如果定义了下面的一个布局,同时运行在不同尺寸设备下会显示不同的效果. (iPhone6-4.7inch) (iPhone5s-4inch) ...

  2. CF455C Civilization (并查集)

    CF456E Codeforces Round #260 (Div. 1) C Codeforces Round #260 (Div. 2) E http://codeforces.com/conte ...

  3. Mongoose简单的连表查询

    原文摘自我的前端博客,欢迎大家来访问 http://www.hacke2.cn 像我这篇文章所说的基于Node.js + jade + Mongoose 模仿gokk.tv,当时停止开发是因为我深深的 ...

  4. JavaScript数组属性与方法

    Array 对象属性 属性 描述 constructor 返回对创建此对象的数组函数的引用. length 设置或返回数组中元素的数目. prototype 使您有能力向对象添加属性和方法. Arra ...

  5. JavaWeb学习总结(五十三)——Web应用中使用JavaMail发送邮件

    现在很多的网站都提供有用户注册功能, 通常我们注册成功之后就会收到一封来自注册网站的邮件.邮件里面的内容可能包含了我们的注册的用户名和密码以及一个激活账户的超链接等信息.今天我们也来实现一个这样的功能 ...

  6. eclipse tomcat debug启动慢

    myeclipse或eclipse下debug模式启动很慢,默认模式也是debug,网上找了终于解决, 原因是有eclipse或myeclipse启动debug时自动添加断点,所以必须删除一些东西. ...

  7. 【PHP面向对象(OOP)编程入门教程】7.特殊的引用”$this“的使用

    现在我们知道了如何访问对象中的成员,是通过”对象->成员”的方式访问的,这是在对象的外部去访问对象中成员的形式, 那么如果我想在对象的内部,让对象里的方法访问本对象的属性, 或是对象中的方法去调 ...

  8. Java项目相关监控与调优

    Linux  JVM Tomcat =========Linux =============== 监控 nmon  命令:nmon -s 10 -c 60 -f -m /home -s 10 每10s ...

  9. YC大牛的判题任务-想法

    YC大牛的判题任务 Time Limit: 1000ms Memory Limit: 65536KB   64-bit integer IO format: %lld      Java class ...

  10. 获取MAC地址的几种方式

    .NET 后台中 using System; using System.Collections.Generic; using System.Linq; using System.Web; using ...