两道较为典型的单源最短路径问题,采用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. margin-bottom在IE6和IE7下失效的解决办法

    IE6/7下margin-bottom无效一般出现在容器里某元素设置后在父容器内无效,这个时候只需要在父容器中加入以下两句css,基本上所有的浏览器都兼容了: overflow:hidden;zoom ...

  2. 通过mongodb客户端samus代码研究解决查询慢问题

    最近有项目需要用到mongodb,于是在网上下载了mongodb的源码,根据示例写了测试代码,但发现一个非常奇怪的问题:插入记录的速度比获取数据的速度还要快,而且最重要的问题是获取数据的速度无法让人接 ...

  3. Java中的LookAndFeel

    Java'中的几种Look and Feel1.Metal风格 (默认)String lookAndFeel = "javax.swing.plaf.metal.MetalLookAndFe ...

  4. Maven初级学习(一)手把手教你Maven安装

    序:学习安装Maven,在Windows和Unix系统上. 一.Windows系统安装MVN 前提正确安装JDK1.5以上的版本 1 下载最先版Mvn http://maven.opache.org/ ...

  5. Docker容器基础知识学习

    Docker作为操作系统层面的轻量级的虚拟化技术,凭借简易的使用.快速的部署以及灵活敏捷的集成等优势,迅速发展目前最为火热的技术. 1.云计算服务是一种资源管理的资源服务,该模式可以实现随时随地.便捷 ...

  6. C#深入浅出 关键字(一)

    1.this this关键字用于指示当前对象“自己”,来看一个例子,了解什么时候需要用this class Star { String name; int age; public void SetIn ...

  7. 2013成都Regional:一块木板,几个气球

    先来看木板: 再来看气球: 最后看木板+气球: google送的纪念品....  到现在还没敢打乱: 赛场外面.... 赛场里面: 和比赛时出了问题,并现场换了一台的电脑(对面长安大学1队)... 最 ...

  8. js 区分数据类型

    这是第二版,可以区分 1.基本数据类型(string.number.boolean) undefined.null 2.引用类型 数组.RegExp.函数. 自定义数据类型(通过new 函数名得到) ...

  9. vncserver和Ubuntu Xfce4远程桌面环境的配置,解决不显示图形界面

    vncserver和Ubuntu Xfce4远程桌面环境的配置 参考的http://blog.163.com/thinki_cao/blog/static/8394487520130301453180 ...

  10. css3延时动画

    不太理解属性都是什么意思,但是有动画效果,我也是惊呆了 <style> #animated_div{animation:animated_div 4s 1; -moz-animation: ...