nyoj1006(最短路次短路spfa)

偷西瓜

时间限制:1000 ms  |  内存限制:65535 KB

难度:4

描述

对于农村的孩子来说最大的乐趣,莫过于和小伙伴们一块下地偷西瓜了,虽然孩子们条件不是很好,但是往往他们很聪明,他们总在计算着到达瓜田的距离,以及逃跑的路线,他们总是以最短的距离冲到瓜田里面,然后以最短的距离回到出发的地方,不过瓜田的大人们已经在他们来的路上等待他们。于是聪明的小伙伴们便不走过的路,即每条路只走一遍,如果小伙伴们回不到出发的地方,他们就说“eating”,

我们假设 有 n (n<=100)个 村庄 m条路(m<=1000)小伙伴们总是从1号村庄出发,而瓜田总是在n号村庄.如果小伙伴们到达不了n号村庄,或者回不到1号村庄请输出"eating";

输入
多组数据

第一行一个整数 n

第二行 一个整数 m

随后的m行 有 三个数u,v,w 表示u 到 v村庄的距离为w(w<=1000);

输出
求小伙伴们从1号村庄出发,到 n号村庄,再回到1号村庄所用的最短距离,如果不能回到1号村庄请输出“eating”.
样例输入
2
1
1 2 999
3
3
1 3 10
2 1 20
3 2 50
样例输出
eating
80
上传者

分析:求一个最短路和一个次短路的和。

那么我们用spfa求一次从1到n的最短路,然后顺便记录路径,然后求完之后把走过的路径删去。然后在求一次1到n的最短路。

spfa讲解:http://blog.csdn.net/y990041769/article/details/18367665

代码:

[cpp] view
plain
copyprint?

  1. #include <cstdio>
  2. #include <vector>
  3. #include <iostream>
  4. #include <stack>
  5. #include <cstdio>
  6. #include <string>
  7. #include <cstring>
  8. #include <cmath>
  9. #include <algorithm>
  10. #include <queue>
  11. using namespace std;
  12. const int inf = 0x3f3f3f3f;
  13. const int N = 300;
  14. struct Point
  15. {
  16. int x,y;
  17. int r;
  18. int num;
  19. };
  20. Point a[N];
  21. struct Node
  22. {
  23. int v,len;
  24. };
  25. vector<Node> map[N];
  26. int n,m;
  27. void spfa(int s,int dis[])
  28. {
  29. int i,pre[N];
  30. bool used[N];
  31. queue<int> q;
  32. memset(used,0,sizeof(used));
  33. memset(pre,-1,sizeof(pre));
  34. for(i=0; i<N; i++)
  35. dis[i]=inf;
  36. dis[s]=0;
  37. used[s]=true;
  38. q.push(s);
  39. while(!q.empty())
  40. {
  41. int u=q.front();
  42. q.pop();
  43. used[u]=false;
  44. for(i=0; i<map[u].size(); i++)
  45. {
  46. Node p=map[u][i];
  47. if(dis[p.v]>dis[u]+p.len)
  48. {
  49. dis[p.v]=dis[u]+p.len;
  50. pre[p.v]=u;
  51. if(!used[p.v])
  52. {
  53. used[p.v]=true;
  54. q.push(p.v);
  55. }
  56. }
  57. }
  58. }
  59. for(int i=n;pre[i]!=-1;i=pre[i])
  60. {
  61. //        printf("%d ",pre[i]);
  62. for(int j=0;j<map[i].size();j++)
  63. {
  64. if(map[i][j].v==pre[i])
  65. map[i].erase(map[i].begin()+j);
  66. }
  67. for(int j=0;j<map[pre[i]].size();j++)
  68. {
  69. if(map[pre[i]][j].v==i)
  70. map[pre[i]].erase(map[pre[i]].begin()+j);
  71. }
  72. }
  73. }
  74. int main()
  75. {
  76. int dis1[N];
  77. while(~scanf("%d%d",&n,&m))
  78. {
  79. for(int i=0;i<=n;i++)
  80. map[i].clear();
  81. for(int i=0;i<m;i++)
  82. {
  83. int x,y,z;
  84. scanf("%d%d%d",&x,&y,&z);
  85. Node tmp;
  86. tmp.v=y,tmp.len=z;
  87. map[x].push_back(tmp);
  88. tmp.v=x;
  89. map[y].push_back(tmp);
  90. }
  91. int ans=0;
  92. spfa(1,dis1);
  93. ans+=dis1[n];
  94. spfa(1,dis1);
  95. ans+=dis1[n];
  96. if(ans>=inf)
  97. printf("eating\n");
  98. else
  99. printf("%d\n",ans);
  100. }
  101. return 0;
  102. }

nyoj1006(最短路次短路spfa)

时间: 2024-10-10 01:31:25

nyoj1006(最短路次短路spfa)的相关文章

POJ 2449Remmarguts&#39; Date K短路模板 A*+SPFA

太水了我不想说了,模板在这里 14312K 313MS 1 #include<queue> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int v[100010],v2[100010],c[100010],c2[100010],s,t,k,duin; 7 int n,m,point[1010],next[100010],cnt=0,

hdu--2544--题如其名&lt;最短路&gt;--dij&lt;priority_queue&gt;||spfa&lt;queue&gt;

这题 让我深刻地 感受到了 题如其名 =-= ......... 一直以来都写spfa 这次 也顺便写了下 dij<链式前向星&&priority_queue> 代码太长了.. 但是 要是思路清晰的话 写下去的感觉很爽的... 当然 我还是更加喜欢 spfa 关于 链式前向星 可以---传送--出产地学习 关于 spfa -- 我没找到特别出色的介绍<我也写过..> 这个不难 你可以随便去找一篇来学习 关于 dij -- 也是图论的入门重要算法 介绍它的博客实在太多

[图论]最短路计数(spfa)

最短路计数 Description 给出一个NN个顶点MM条边的无向无权图,顶点编号为1-N1−N.问从顶点11开始,到其他每个点的最短路有几条. Input 第一行包含22个正整数N,MN,M,为图的顶点数与边数. 接下来MM行,每行22个正整数x,yx,y,表示有一条顶点xx连向顶点yy的边,请注意可能有自环与重边. output 共NN行,每行一个非负整数,第ii行输出从顶点11到顶点ii有多少条不同的最短路,由于答案有可能会很大,你只需要输出ans \bmod 100003ansmod1

poj 3463 Sightseeing(最短路+次短路)

http://poj.org/problem?id=3463 大致题意:给出一个有向图,从起点到终点求出最短路和次短路的条数之和. 解法: 用到的数组:dis[i][0]:i到起点的最短路,dis[i][1]:i到起点的严格次短路 vis[i][0],vis[i][1]:同一维的vis数组,标记距离是否已确定 sum[i][0]:i到起点的最短路条数,sum[i][1]:i到起点的次短路条数 同一维dijkstra,内循环先找出最短的距离(次短路或最短路)d,然后枚举与该点相连的点: if(d

HDU 2544 最短路 (最短路)

最短路 Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 31955    Accepted Submission(s): 13845 Problem Description 在每年的校赛里,所有进入决赛的同学都会获得一件很漂亮的t-shirt.但是每当我们的工作人员把上百件的衣服从商店运回到赛场的时候,却是非常累的!所以现在他们想要寻找最

【最短路】【spfa】hdu6071 Lazy Running

给你一个4个点的环,问你从2号点出发, 再回到2号点,长度>=K的最短路是多少.环上的边长度不超过30000. 跑出来所有dis(2,j)以后,然后for一遍j,根据dis(2,j)+t*2*w>=K,解出来对于每个j而言最小的t,然后尝试更新答案即可.如果dis(2,j)已经大于等于K了,那直接用其尝试更新答案. 跟CDOJ1633很像. #include<cstdio> #include<queue> #include<algorithm> #inclu

HDU 1217 Arbitrage 【最短路,map+spfa】

Arbitrage Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 6985    Accepted Submission(s): 3212 Problem Description Arbitrage is the use of discrepancies in currency exchange rates to transform

【最短路】【spfa】CDOJ1647 酌贪泉而觉爽, 处涸辙以犹欢。

题意: 给你一个全为0的01串,问你能否通过一系列的变换,得到全为1的01串. 分析: 将每个01串看作一个点,每一个变换可以看作是一条有向边,现在问题可以转化 为找从"00..0"这个点到"11..1"这个点的最短路,那么可以使用spfa来解决这个问题. 对于每个CFT,建一条有向边,从si指向ti,权值为ti.然后跑spfa即可. #include<cstdio> #include<queue> #include<iostream&

【最短路】【spfa】【最小割】【Dinic】bzoj1266 [AHOI2006]上学路线route

原问题等价于断掉一些边,让原来所有的最短路全都无法联通S和T. 先求最短路,然后把在最短路上的边(dis[u[i]]+w[i]==dis[v[i]])加入新图里,跑最小割.显然. 注意是无向图. #include<cstdio> #include<cstring> #include<queue> #include<algorithm> using namespace std; #define INF 2147483647 #define MAXN 511 #