以Floyd解法为主的练习题六道


ZOJ2027-Travelling Fee

  1. //可免去一条线路中直接连接两城市的最大旅行费用,求最小总旅行费用
  2. //Time:0Ms Memory:604K
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. #define MAX 205
  10. #define MAXS 12
  11. #define INF 0x3f3f3f3f
  12.  
  13. int n,m;
  14. int dis[MAX][MAX];
  15. int high[MAX][MAX]; //该线路中直接连接两城市的最大旅行费用
  16.  
  17. struct City {
  18. char name[MAXS];
  19. }c[MAX];
  20.  
  21. int find(char s[MAXS])
  22. {
  23. for (int i = 0; i < n; i++)
  24. if (!strcmp(s, c[i].name)) return i;
  25. return -1;
  26. }
  27.  
  28. void floyd()
  29. {
  30. for (int k = 0; k < n; k++)
  31. for (int i = 0; i < n; i++)
  32. for (int j = 0; j < n; j++)
  33. {
  34. if (high[i][k] == -1 || high[k][j] == -1) continue;
  35. int maxCost = max(high[i][k], high[k][j]);
  36. if (dis[i][j] - high[i][j] > dis[i][k] + dis[k][j] - maxCost)
  37. {
  38. dis[i][j] = dis[i][k] + dis[k][j];
  39. high[i][j] = maxCost;
  40. }
  41. }
  42. }
  43.  
  44. int main()
  45. {
  46. while (scanf("%s%s", c[0].name, c[1].name) != EOF)
  47. {
  48. memset(dis, INF, sizeof(dis));
  49. memset(high, -1, sizeof(high));
  50. int d; n = 2;
  51. char s[MAXS],t[MAXS];
  52. scanf("%d", &m);
  53. while (m--)
  54. {
  55. scanf("%s%s%d", s, t, &d);
  56. int ns = find(s), nt = find(t);
  57. if (ns == -1) {
  58. memcpy(c[n].name, s, sizeof(s));
  59. ns = n++;
  60. }
  61. if (nt == -1) {
  62. memcpy(c[n].name, t, sizeof(t));
  63. nt = n++;
  64. }
  65. high[ns][nt] = dis[ns][nt] = d;
  66. }
  67. floyd();
  68. printf("%d\n", dis[0][1] - high[0][1]);
  69. }
  70.  
  71. return 0;
  72. }

POJ2253-Frogger

  1. //求0->1间的最小的最大单次青蛙跳跃距离
  2. //Time:94Ms Memory:508K
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<algorithm>
  7. #include<cmath>
  8. using namespace std;
  9.  
  10. #define MAX 205
  11. #define POW2(x) ((x)*(x))
  12. #define DIS(a,b) (sqrt(POW2(p[a].x - p[b].x) + POW2(p[a].y - p[b].y)))
  13.  
  14. struct Point {
  15. double x, y;
  16. }p[MAX];
  17.  
  18. int n;
  19. double dis[MAX][MAX]; //两点间最小的最大一次跳跃距离
  20.  
  21. void floyd()
  22. {
  23. for (int k = 0; k < n; k++)
  24. for (int i = 0; i < n; i++)
  25. for (int j = 0; j < n; j++)
  26. dis[i][j] = min(dis[i][j], max(dis[i][k], dis[k][j]));
  27. }
  28.  
  29. int main()
  30. {
  31. int cas = 1;
  32. while (scanf("%d", &n), n)
  33. {
  34. for (int i = 0; i < n; i++)
  35. {
  36. scanf("%lf%lf", &p[i].x, &p[i].y);
  37. for (int j = 0; j < i; j++)
  38. dis[i][j] = dis[j][i] = DIS(i, j);
  39. dis[i][i] = 0;
  40. }
  41.  
  42. floyd();
  43. printf("Scenario #%d\n", cas++);
  44. printf("Frog Distance = %.3f\n\n", dis[0][1]);
  45. }
  46. return 0;
  47. }

POJ2472-106 miles to Chicago

  1. //求1到n的最大存活率
  2. //Time:157Ms Memory:264K
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. #define MAX 105
  10. int n, m;
  11. double dis[MAX][MAX];
  12.  
  13. void floyd()
  14. {
  15. for (int k = 1; k <= n; k++)
  16. for (int i = 1; i <= n; i++)
  17. for (int j = 1; j <= n; j++)
  18. dis[i][j] = max(dis[i][j], dis[i][k] * dis[k][j]);
  19. }
  20.  
  21. int main()
  22. {
  23. while (scanf("%d%d", &n, &m), n)
  24. {
  25. memset(dis, 0, sizeof(dis));
  26. int x, y, d;
  27. while (m--) {
  28. scanf("%d%d%d", &x, &y, &d);
  29. dis[x][y] = dis[y][x] = d / 100.0;
  30. }
  31. floyd();
  32. printf("%.6lf percent\n", 100*dis[1][n]);
  33. }
  34. return 0;
  35. }

POJ1125-Stockbroker Grapevine

  1. //从某点扩散到所有点的最短时间-求出该点及时间
  2. //Time:0Ms Memory:208K
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. #define MAX 105
  10. #define INF 0x3f3f3f3f
  11.  
  12. int n, m;
  13. int dis[MAX][MAX];
  14. int time[MAX];
  15.  
  16. void floyd()
  17. {
  18. for (int k = 1; k <= n; k++)
  19. for (int i = 1; i <= n; i++)
  20. for (int j = 1; j <= n; j++)
  21. dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  22. }
  23.  
  24. int main()
  25. {
  26. while (scanf("%d", &n), n)
  27. {
  28. memset(dis, INF, sizeof(dis));
  29. memset(time, 0, sizeof(time));
  30. int y, d;
  31. for (int x = 1; x <= n; x++)
  32. {
  33. scanf("%d", &m);
  34. while (m--) {
  35. scanf("%d%d", &y, &d);
  36. dis[x][y] = d;
  37. dis[x][x] = 0;
  38. }
  39. }
  40. floyd();
  41. int Min = INF;
  42. int k = 0;
  43. for (int i = 1; i <= n; i++)
  44. for (int j = 1; j <= n; j++)
  45. time[i] = max(time[i], dis[i][j]);
  46. for (int i = 1; i <= n; i++)
  47. {
  48. if (Min > time[i])
  49. {
  50. Min = time[i];
  51. k = i;
  52. }
  53. }
  54. if (Min == INF) printf("disjoint\n");
  55. else printf("%d %d\n", k, Min);
  56. }
  57. return 0;
  58. }

POJ1603-Risk

  1. //求依靠攻打接壤国需要最少攻打多少国家才能从起始国家打到终止国家
  2. //Time:0Ms Memory:168K
  3. #include<iostream>
  4. #include<cstring>
  5. #include<cstdio>
  6. #include<algorithm>
  7. using namespace std;
  8.  
  9. #define MAX 21
  10. #define INF 0x3f3f3f3f
  11.  
  12. int n, m;
  13. int dis[MAX][MAX];
  14.  
  15. void floyd()
  16. {
  17. for (int k = 1; k <= n; k++)
  18. for (int i = 1; i <= n; i++)
  19. for (int j = 1; j <= n; j++)
  20. dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  21. }
  22.  
  23. int main()
  24. {
  25. int cas = 0;
  26. n = 20;
  27. while (scanf("%d", &m) != EOF)
  28. {
  29. memset(dis, INF, sizeof(dis));
  30. int x, y;
  31. for (x = 1; x <= 19; x++)
  32. {
  33. while (m--) {
  34. scanf("%d", &y);
  35. dis[x][y] = dis[y][x] = 1;
  36. }
  37. scanf("%d", &m);
  38. }
  39. floyd();
  40. if (cas) printf("\n");
  41. printf("Test Set #%d\n", ++cas);
  42. while (m--) {
  43. scanf("%d%d", &x, &y);
  44. printf("%d to %d: %d\n", x, y, dis[x][y]);
  45. }
  46. }
  47. return 0;
  48. }

POJ2607-Fire Station

  这道题稍微比上面的五道题复杂一些

  1. //Floyd解法
  2. //已知消防站,现建新消防站,使得所有路口到消防站的最大值减至最小,将最小序列路口输出
  3. //Time:1797Ms Memory:1164K
  4. #include<iostream>
  5. #include<cstring>
  6. #include<cstdio>
  7. #include<algorithm>
  8. using namespace std;
  9.  
  10. #define MAX 505
  11. #define INF 0x3f3f3f3f
  12.  
  13. int f, n, m;
  14. int dis[MAX][MAX];
  15. bool v[MAX];
  16. int md[MAX]; //各路口到消防站最短距离
  17.  
  18. void floyd()
  19. {
  20. for (int k = 1; k <= n; k++)
  21. for (int i = 1; i <= n; i++)
  22. for (int j = 1; j <= n; j++)
  23. dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
  24. }
  25.  
  26. int main()
  27. {
  28. memset(dis, INF, sizeof(dis));
  29. memset(md, INF, sizeof(md));
  30. scanf("%d%d", &f, &n);
  31. int x, y, d;
  32. for (int i = 0; i < f;i++){
  33. scanf("%d", &x);
  34. v[x] = true;
  35. dis[x][x] = 0;
  36. }
  37. while (scanf("%d%d%d", &x, &y, &d) != EOF)
  38. dis[x][y] = dis[y][x] = d;
  39. floyd();
  40. for (int i = 1; i <= n; i++)
  41. {
  42. dis[i][i] = 0;
  43. if (!v[i]) continue;
  44. for (int j = 1; j <= n; j++)
  45. md[j] = min(md[j], dis[i][j]);
  46. }
  47.  
  48. int Max = INF, k = 1; //默认为1,否则A不掉(我怀疑数据有问题或题目描述不清)
  49. for (int i = 1; i <= n; i++)
  50. {
  51. if (v[i]) continue;
  52. int tmp = 0;
  53. for (int j = 1; j <= n; j++)
  54. tmp = max(tmp, min(md[j], dis[i][j]));
  55. if (Max > tmp)
  56. {
  57. Max = tmp;
  58. k = i;
  59. }
  60. }
  61. printf("%d\n", k);
  62. return 0;
  63. }

ACM/ICPC 之 Floyd练习六道(ZOJ2027-POJ2253-POJ2472-POJ1125-POJ1603-POJ2607)的更多相关文章

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

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

  2. ACM/ICPC 之 Floyd+记录路径后继(Hdu1385(ZOJ1456))

    需要处理好字典序最小的路径 HDU1385(ZOJ1456)-Minimum Transport //Hdu1385-ZOJ1456 //给定邻接矩阵,求给定起点到终点的最短路径,若有相同路长的路径按 ...

  3. 2014嘉杰信息杯ACM/ICPC湖南程序设计邀请赛暨第六届湘潭市程序设计竞赛

    比赛链接: http://202.197.224.59/OnlineJudge2/index.php/Contest/problems/contest_id/36 题目来源: 2014嘉杰信息杯ACM ...

  4. ACM/ICPC 之 BFS(离线)+康拓展开(TSH OJ-玩具(Toy))

    祝大家新年快乐,相信在新的一年里一定有我们自己的梦! 这是一个简化的魔板问题,只需输出步骤即可. 玩具(Toy) 描述 ZC神最擅长逻辑推理,一日,他给大家讲述起自己儿时的数字玩具. 该玩具酷似魔方, ...

  5. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 G. Garden Gathering

    Problem G. Garden Gathering Input file: standard input Output file: standard output Time limit: 3 se ...

  6. ACM ICPC 2015 Moscow Subregional Russia, Moscow, Dolgoprudny, October, 18, 2015 D. Delay Time

    Problem D. Delay Time Input file: standard input Output file: standard output Time limit: 1 second M ...

  7. hduoj 4710 Balls Rearrangement 2013 ACM/ICPC Asia Regional Online —— Warmup

    http://acm.hdu.edu.cn/showproblem.php?pid=4710 Balls Rearrangement Time Limit: 6000/3000 MS (Java/Ot ...

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

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

  9. 【转】ACM/ICPC生涯总结暨退役宣言—alpc55

    转自:http://hi.baidu.com/accplaystation/item/ca4c2ec565fa0b7fced4f811 ACM/ICPC生涯总结暨退役宣言—alpc55 前言 早就该写 ...

随机推荐

  1. Java中符号位扩展

    第一个例子: byte b=-100;b在内存中是以补码的形式存贮的:1001 1100 如果执行char c=(char)b;如3楼企鹅先生所说:b要先变为int,这时增加的位全要用b的符号位填充( ...

  2. background的css 排列顺序写法?

    可以按顺序设置如下属性(可点击进入相应的css手册查看使用): background-color 背景颜色 background-image 背景图片 background-repeat 背景重复 b ...

  3. 计算机中的DMA的多种含义?

    DMA: 一是 动态内存分配:dynamic memory allocate. 就是程序在执行过程中分配内存. 这就是我们在c/c++中经常用到的new, delete, alloc(函数)等等. [ ...

  4. nginx下面server配置

    haomeiv配置 log_format www.haomeiv.com '$remote_addr - $remote_user [$time_local] "$request" ...

  5. emlog在nginx中添加rewrite规则

    rewrite ^/(post|record|sort|author|page)-([-]+)\.html$ /index.php?$=$; rewrite ^/tag-(.+)\.html$ /in ...

  6. [译]Probable C# 6.0 features illustrated

    原文: http://damieng.com/blog/2013/12/09/probable-c-6-0-features-illustrated ========================= ...

  7. 【Solr】数据库数据导入索引库

    目录 分析框图 配置数据库与solrconfig.xml 回到顶部 分析框图 框图画的粗糙!勿喷啊!勿喷啊! 回到顶部 配置数据库与solrconfig.xml Dataimport插件 可以批量把数 ...

  8. Swift2.1 语法指南——自动引用计数

    原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...

  9. Java网络编程学习

    服务器是指提供信息的计算机或程序,客户机是指请求信息的计算机或程序,而网络用于连接服务器与客户机,实现两者相互通信.但有时在某个网络中很难将服务器与客户机区分开.我们通常所说的“局域网”(Local ...

  10. sublime linux下无法输入中文

    cd ~ vim sublime_imfix.c 输入 #include <gtk/gtkimcontext.h> void gtk_im_context_set_client_windo ...