和往常一样,继续从题目引入

树上奶牛

(tree.cpp)

【题目描述】

农夫John的奶牛不是住在地上而是住在树上的QWQ。

奶牛之间需要串门,不过在串门之前他们会向John询问距离的大小。可是John的产业有点大奶牛的个数有点多,这让农夫John感到头疼,你能帮助他吗?

Ps:这里提到的树为OI界的[树],即无向无环图。而且因为一棵树的承载量是有限的,所以所有的奶牛可能会分布在不同的树上,即OI界的[森林]。

【文件格式】

输入文件:

第一行两个整数n m,分别表示n个结点m条边。

以下m行,每行三个整数u,v,w,分别表示u,v之间有一条距离为w的树边。

第m+2行一个整数q,表示询问的个数。

以下q行,每行两个整数u,v,表示奶牛要询问u,v之间的距离。

输出文件:

输出q行,每行对应一个询问输出答案。如果u,v不处于同一棵树上,请回答-1。

【样例数据】

Input(tree.in

5 3

1 3 5393

3 4 2845

4 2 3757

3

1 4

1 2

1 5

Output (tree.out)

8238

11995

-1

【数据约束】

对于30%的数据,n<=1000 , m<=1000 , q<=10000。

对于100%的数据,n<=10000,m<=40000,q<=100000。

[Hint] 对于所有数据皆随机生成。

这道题目打眼看过去就知道是个图上的最短路径问题,查询某个点是否与另一个点相连,如果相连输出最短路径,否则的话输出“-1”。

看上面我用黄色标出的部分,数据范围略大,这里我是用的结构体存边和边权:

  1. struct node
  2. {
  3. int weight;
  4. int one;
  5. int two;
  6. };
  7. node a[40000];

  

这道题并不是简单的图上的最短路问题,它有一个查询的过程,这里我是用的并查集判断两个点是否有链接,如果是的话就用贝尔曼-福德求最短路,如果否的话就直接输出“-1”:

  1. int father[10000];
  2. //判断是否连接
  3. int find(int x)
  4. {
  5. if(father[x]!=x) return find(father[x]);
  6. else return x;
  7. }
  8.  
  9. if(find(u)==find(v))
  10. {
  11. sou(u,v);
  12. }
  13. else
  14. {
  15. cout<<"-1";
  16. }

  

下面上代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<cmath>
  5.  
  6. using namespace std;
  7.  
  8. struct node
  9. {
  10. int weight;
  11. int one;
  12. int two;
  13. };
  14. node a[40000];
  15.  
  16. int father[10000];
  17.  
  18. int n,m;
  19. int u,v,w;
  20. int q;
  21.  
  22. void sou(int x,int y)
  23. {
  24. long long dis[n+1];
  25. for(int i=1;i<=n+1;i++)
  26. {
  27. dis[i]=0x7ffffff;
  28. }
  29. dis[x]=0;
  30. for(int i=1;i<=n;i++)
  31. {
  32. for(int j=1;j<=m;j++)
  33. {
  34. if(dis[a[j].one]+a[j].weight<dis[a[j].two]) dis[a[j].two]=dis[a[j].one]+a[j].weight;
  35. if(dis[a[j].two]+a[j].weight<dis[a[j].one]) dis[a[j].one]=dis[a[j].two]+a[j].weight;
  36. }
  37. }
  38. cout<<dis[y]<<endl;
  39. }
  40.  
  41. int find(int x)
  42. {
  43. if(father[x]!=x) return find(father[x]);
  44. else return x;
  45. }
  46.  
  47. int main()
  48. {
  49. freopen("tree.in","r",stdin);
  50. freopen("tree.out","w",stdout);
  51. cin>>n>>m;
  52. for(int i=1;i<=n;i++)
  53. {
  54. father[i]=i;
  55. }
  56. for(int i=1;i<=m;i++)
  57. {
  58. cin>>u>>v;
  59. a[i].one=u;
  60. a[i].two=v;
  61. father[u]=v;
  62. //father[v]=u;
  63. cin>>a[i].weight;
  64.  
  65. }
  66. cin>>q;
  67. for(int i=1;i<=q;i++)
  68. {
  69. cin>>u>>v;
  70.  
  71. if(find(u)==find(v))
  72. {
  73. sou(u,v);
  74. }
  75. else
  76. {
  77. cout<<"-1";
  78. }
  79.  
  80. }
  81. }

  注:还没有测评,用的贝尔曼福德q大的时候可能会有点超时,可以再用SPFA试一下。。。

图的最短路径问题————树上奶牛(tree.cpp)的更多相关文章

  1. c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法

    c/c++ 图的最短路径 Dijkstra(迪杰斯特拉)算法 图的最短路径的概念: 一位旅客要从城市A到城市B,他希望选择一条途中中转次数最少的路线.假设途中每一站都需要换车,则这个问题反映到图上就是 ...

  2. 带权图的最短路径算法(Dijkstra)实现

    一,介绍 本文实现带权图的最短路径算法.给定图中一个顶点,求解该顶点到图中所有其他顶点的最短路径 以及 最短路径的长度.在决定写这篇文章之前,在网上找了很多关于Dijkstra算法实现,但大部分是不带 ...

  3. 数据结构 -- 图的最短路径 Java版

    作者版权所有,转载请注明出处,多谢.http://www.cnblogs.com/Henvealf/p/5574455.html 上一篇介绍了有关图的表示和遍历实现.数据结构 -- 简单图的实现与遍历 ...

  4. C++编程练习(11)----“图的最短路径问题“(Dijkstra算法、Floyd算法)

    1.Dijkstra算法 求一个顶点到其它所有顶点的最短路径,是一种按路径长度递增的次序产生最短路径的算法. 算法思想: 按路径长度递增次序产生算法: 把顶点集合V分成两组: (1)S:已求出的顶点的 ...

  5. python解决图的最短路径问题

    在hihoCoder上遇到一个算法题目,描述如下: 对图结构有了解的不难发现,这是经典的求图的最短路径问题.以下是python代码: def findMin(row): minL = max(row) ...

  6. 图的最短路径---迪杰斯特拉(Dijkstra)算法浅析

    什么是最短路径 在网图和非网图中,最短路径的含义是不一样的.对于非网图没有边上的权值,所谓的最短路径,其实就是指两顶点之间经过的边数最少的路径. 对于网图,最短路径就是指两顶点之间经过的边上权值之和最 ...

  7. 数据结构(C#):图的最短路径问题、(Dijkstra算法)

    今天曾洋老师教了有关于图的最短路径问题,现在对例子进行一个自己的理解和整理: 题目: 要求:变成计算出给出结点V1到结点V8的最短路径 答: 首先呢,我会先通过图先把从V1到V8的各种路径全部计算下来 ...

  8. Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例

    本文实例讲述了Python数据结构与算法之图的最短路径(Dijkstra算法).分享给大家供大家参考,具体如下: # coding:utf-8 # Dijkstra算法--通过边实现松弛 # 指定一个 ...

  9. 图的最短路径-----------SPFA算法详解(TjuOj2831_Wormholes)

    这次整理了一下SPFA算法,首先相比Dijkstra算法,SPFA可以处理带有负权变的图.(个人认为原因是SPFA在进行松弛操作时可以对某一条边重复进行松弛,如果存在负权边,在多次松弛某边时可以更新该 ...

随机推荐

  1. Html5 Css实现方形图片 圆形显示

    <!doctype html><html><head><meta charset="utf-8"><title>方形图片 ...

  2. javascript 算法

    前段时间学习算法方面的知识看了一下用C语言写的一些简单的算法自己用js模拟实现一遍现在整理出来和大家分享一下. 河内塔 斐波那契数列 巴斯卡三角形 三色棋 河内之塔(Towers of Hanoi)是 ...

  3. HDU-1049

    Description An inch worm is at the bottom of a well n inches deep. It has enough energy to climb u i ...

  4. 利用ajax做的柱状图,线性统计图,饼状图

    柱状图,两个不同类型的数据 以下是html页面代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...

  5. 开启MongoDB 脚本和设置window自启

    wwchen: D: cd D:\Program Files\MongoDB\Server\3.2\bin mongod --dbpath=D:\mongodb\db----------------- ...

  6. WebView高危接口安全检测

    高危]WebView高危接口安全检测共2处详细内容:在Android系统4.3.1~3.0版本,系统webview默认添加了searchBoxJavaBridge_接口,如果未移除该接口可能导致低版本 ...

  7. 绑定事件导致发送多个ajax请求的问题

    如果遇到每次触发click, change等事件时ajax请求都会增加一个,这种情况很有可能是每次触发事件都会多绑定一个事件,解决办法就是在每次绑定事件之前要解除绑定.

  8. 提升Boolean和out相结合的用户体验

    在我们编写代码的过程中经常有这样的需求,比如添加一条数据,我们想要的结果是如果添加成功了就返回true,如果添加失败了就返回false,在返回false的同时携带错误信息,我们通常的做法是定义这样的方 ...

  9. ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 错误分析

    目录(?)[+] 1. 问题起因 最近在进行Oracle的一些操作时,总会遇到这个错误:  ORA-06502: PL/SQL: 数字或值错误 :  字符串缓冲区太小,错误如下: ORA-00604: ...

  10. 强化一下,QDialog有专门的exec函数和finished信号,QWidget都没有

    http://blog.csdn.net/dbzhang800/article/details/6300519