题目描述 Description

现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'a'..'z'和'A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是'Z',注意没有母牛在谷仓中。

注意'm'和'M'不是同一个牧场否则错误上面的意思是说:输入数据中可能会同时存在M,m(郁闷ing),比如

M a a m m z

输入描述 Input Description

第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。

第 2 ..P+1行:  用空格分开的两个字母和一个整数:

被道路连接牧场的标记和道路的长度(1<=长度<=1000)。

输出描述 Output Description

单独的一行包含二个项目:最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。

样例输入 Sample Input

5

A d 6

B d 3

C e 9

d Z 8

e Z 3

样例输出 Sample Output

B 11

思路分析:读入时稍微处理一下就好,很简单,注意自己和自己不能联通。

但是,想着连连next数组,写了个SPFA,SB的全跑一遍,60,发现并不会写无向图的next!!!

还是先写正常的flyod吧。。。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. int dis[],st[],ed[],dui[],f[],next[],point[],v[];
  7. int n,m;
  8. bool b[];
  9. void MapB()
  10. {
  11. int i;
  12. char a,c;
  13. m=;
  14. for (i=;i<=n;i++)
  15. {
  16. cin>>a>>c>>v[i];
  17. if (a>='A' && a<='Z')
  18. {
  19. st[i]=int(a)-;
  20. if (!b[st[i]] && a!='Z')
  21. {
  22. f[++m]=st[i];
  23. b[st[i]]=false;
  24. }
  25. }
  26. if (a>='a' && a<='z')
  27. st[i]=int(a)-;
  28. if (c>='A' && c<='Z')
  29. {
  30.  
  31. ed[i]=int(c)-;
  32. /* if (!b[ed[i]] && c!='Z')
  33. {
  34. f[++m]=ed[i];
  35. b[ed[i]]=false;
  36. }*/
  37. }
  38. if (c>='a' && c<='z')
  39. ed[i]=int(c)-;
  40. next[i]=point[st[i]];
  41. point[st[i]]=i;
  42. }
  43. }
  44. void mlSPFA()
  45. {
  46. int i,j;
  47. int xl,now;
  48. int h=;int t=;
  49. int minn=;
  50. int x;
  51. for (i=;i<=m;i++)
  52. {
  53. memset(dui,,sizeof(dui));
  54. memset(b,,sizeof(b));
  55. memset(dis,,sizeof(dis));
  56. h=;t=;
  57. b[f[i]]=true;
  58. dis[f[i]]=;
  59. dui[]=f[i];
  60. while(h<t)
  61. {
  62. h++;
  63. now=dui[h];
  64. xl=point[now];
  65. while(xl!=)
  66. {
  67. dis[ed[xl]]=dis[now]+v[xl];
  68. if (!b[ed[xl]])
  69. {
  70. dui[++t]=ed[xl];
  71. b[ed[xl]]=true;
  72. }
  73. xl=next[xl];
  74. }
  75. b[now]=false;
  76. }
  77. if (dis[]<minn)
  78. {
  79. minn=dis[];
  80. x=f[i];
  81. }
  82. }
  83. cout<<char(x+)<<' '<<minn;
  84. }
  85. int main()
  86. {
  87. //int i;
  88. //int n,v;
  89. //char a,b;
  90. cin>>n;
  91. MapB();
  92. mlSPFA();
  93.  
  94. }

60分只能做有向图的next数组SPFA,十分的蠢

PS1:后来又把next数组改成无向图,但因为mod了27而不是52,sb一般调了好久,又加上了重边判断,各种xxx,好像还不到60.= =

PS2:第一遍flyod90,存在重复的边,所以取权最小的。因为不耐烦判重错了好几遍,A了。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstring>
  5. using namespace std;
  6. int b1[][],dis[],st[],ed[],dui[],f[],v[],map[][];
  7. int n,m,vv,minn;
  8. bool b[];
  9. void MapB()
  10. {
  11. int i,j;
  12. char a,c;
  13. m=;
  14. for (i=;i<=;i++)
  15. for (j=;j<=;j++)
  16. map[i][j]=;
  17. for (i=;i<=n;i++)
  18. {
  19. cin>>a>>c>>v[i];
  20. if (a>='A' && a<='Z')
  21. {
  22. st[i]=int(a)-;
  23. if (!b[st[i]] && a!='Z')
  24. {
  25. f[++m]=st[i];
  26. b[st[i]]=false;
  27. }
  28. }
  29. if (a>='a' && a<='z')
  30. st[i]=int(a)-;
  31. if (c>='A' && c<='Z')
  32. {
  33.  
  34. ed[i]=int(c)-;
  35. if (!b[ed[i]] && c!='Z')
  36. {
  37. f[++m]=ed[i];
  38. b[ed[i]]=false;
  39. }
  40. }
  41. if (c>='a' && c<='z')
  42. ed[i]=int(c)-;
  43. if (!b1[st[i]][ed[i]]|| (v[i]<map[st[i]][ed[i]]))
  44. {
  45. map[st[i]][ed[i]]=map[ed[i]][st[i]]=v[i];
  46. b1[st[i]][ed[i]]=b1[ed[i]][st[i]]=true;
  47. }
  48. //next[i]=point[st[i]];
  49. //point[st[i]]=i;
  50. //next[i+n]=point[ed[i]];
  51. //point[ed[i]]=i+n;
  52. }
  53. }
  54. void mlflyod()
  55. {
  56. int i,j,k;
  57. minn=;
  58. for (k=;k<=;k++)
  59. for (i=;i<=;i++)
  60. for (j=;j<=;j++)
  61. if (i!=j && i!=k && j!=k)
  62. map[i][j]=min(map[i][j],map[i][k]+map[k][j]);
  63. for (i=;i<=;i++)
  64. if (map[i][]<minn)
  65. {
  66. minn=map[i][];
  67. vv=i;
  68. }
  69.  
  70. }
  71. int main()
  72. {
  73. //int i;
  74. //int n,v;
  75. //char a,b;
  76. char c;
  77. cin>>n;
  78. MapB();
  79. mlflyod();
  80. c=char(vv+);
  81. cout<<c<<' '<<minn;
  82. }

就那样简简单单的过了的flyod

本来是一道30min就应AC的题目,做了1天,原因:算法不熟练,考虑的太不周全,马力弱。

【CodeVS】p1079 回家的更多相关文章

  1. codevs 1079 回家

    1079 回家 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰按响了电铃 ...

  2. codevs 1079 回家x

    1079 回家  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver   题目描述 Description 现在是晚餐时间,而母牛们在外面分散的牧场中. 农民约翰 ...

  3. 魔法禁书目录2:回家(codevs 3024)

    题目描述 Description 大妈打完三战回家,我知道他是怎么回来的,欧洲到日本有L个站点他决定乘坐恰好n次飞机(不是学院都市的超音速飞机)和m次火车来从第一个站点到达最后一个站点.但是有一点很重 ...

  4. T1079 回家 codevs

    http://codevs.cn/problem/1079/ 时间限制: 1 s  空间限制: 128000 KB  题目等级 : 白银 Silver~死坑 题目描述 Description 现在是晚 ...

  5. codevs 1531 山峰

    codevs 1531 山峰 题目描述 Description Rocky山脉有n个山峰,一字排开,从西向东依次编号为1, 2, 3, --, n.每个山峰的高度都是不一样的.编号为i的山峰高度为hi ...

  6. codevs 搜索题汇总(青铜+白银级)

    1792 分解质因数  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 青铜 Bronze   题目描述 Description 编写一个把整数N分解为质因数乘积的程序. 输入描 ...

  7. codevs 1063 合并果子 STL 优先队列

    1063 合并果子 Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codevs.cn/problem/1063/ Description 在一 ...

  8. Codevs 3409 搬运礼物

    3409 搬运礼物 CodeVS原创  时间限制: 1 s  空间限制: 64000 KB  题目等级 : 青铜 Bronze 题解       题目描述 Description 小浣熊松松特别喜欢交 ...

  9. T1063 合并果子 codevs

    http://codevs.cn/problem/1063/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond   题目描述 Description 在一个 ...

随机推荐

  1. 几年前做家教写的C教程(之三专讲了递归和斐波那契)

    C语言学习宝典(3) 数组: 一维数组的定义: 类型说明符  数组名[常量表达式] 例如: int  a[10]; 说明:(1)数组名的命名规则和变量名相同,遵循标示符命名规则 (2)在定义数组时需要 ...

  2. SQL语法中的JOIN类型

    这个要弄明白哟..CROSS JOIN, NATURAL, INNER JOIN ,LEFT OUTER JOIN(LEFT JOIN) 等等....带LEFT,RIGHT的必为OUTER,所以OUT ...

  3. Java Socket编程示例

    一.Socket简介: 1.什么是Socket 网络上的两个程序通过一个双向的通讯连接实现数据的交换,这个双向链路的一端称为一个Socket.Socket通常用来实现客户方和服务方的连接.Socket ...

  4. html5拖拽

    html5拖拽一 <!DOCTYPE html> <html> <head lang="en"> <meta charset=" ...

  5. ortp库入门

    转自:http://blog.csdn.net/suer0101/article/details/7333267 再补充一个代码走读:http://www.xuebuyuan.com/1863409. ...

  6. leetcode1237

    date: 2015-09-09 20:20:58 Two Sum Given an array of integers, find two numbers such that they add up ...

  7. 【hibernate merge】session1.merge(T entity)方法的含义和update方法的区别

    注意:  MERGE语句是SQL语句的一种.在SQL Server.Oracle数据库中可用,MySQL.PostgreSQL中不可用. 1>session1.merge(T entity) 合 ...

  8. sublime快捷键大全

    转自:http://blog.useasp.net/archive/2013/06/14/sublime-text-2-all-default-Shortcuts-table-on-windows-t ...

  9. Linux使用du和df查看磁盘和文件夹占用空间

    df df可以查看一级文件夹大小.使用比例.档案系统及其挂入点,但对文件却无能为力. df -lh 参数 -h 表示使用「Human-readable」输出,也就是使用 GB.MB 等易读的格式. $ ...

  10. MySQL常用数据类型小结

    在 MySQL 中,有三种主要的类型:字符串.数字和日期/时间类型. 目录 [隐藏]  1 字符串类型 2 数值类型 3 日期和时间类型 4 使用建议 5 艺搜参考 字符串类型 CHAR 0-255字 ...