UVA

题意:两个绿洲之间是沙漠,沙漠的温度不同,告诉起点,终点,求使得从起点到终点的最高温度最小的路径,如果有多条,输出长度最短的路径;

思路:用最小费用(最短路径)最大流(最小温度)也能搞吧,但因为题意是看着博客做的,不小心看到了他的思路,就自己实现了一遍,二分温度,假设当前温度为x,求保证最大温度为x的情况下的最短路;打印路径就是递归打印。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <cstring>
  6. #include <cmath>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <set>
  11. #include <map>
  12. #define oo 1e9
  13. #define repu(i, a, b) for(int i = (a); i < (b); i++)
  14. using namespace std;
  15. typedef long long LL;
  16. const int maxn=;
  17. const int INF=0x3f3f3f3f;
  18. int rode[maxn];
  19. int st,ed;
  20. struct Edge
  21. {
  22. int u, v;
  23. double t, d;
  24. Edge(int u, int v, double t, double d):u(u), v(v), t(t), d(d) {}
  25. };
  26. struct qnode
  27. {
  28. int u;
  29. double d;
  30. qnode(int u, double d):u(u), d(d) {}
  31. bool operator < (const qnode a)const
  32. {
  33. return d > a.d;
  34. }
  35. };
  36. struct Dijkstra
  37. {
  38. int n;
  39. vector<int> G[maxn];
  40. vector<Edge> edge;
  41. double d[maxn];
  42. bool vis[maxn];
  43. void init(int n)
  44. {
  45. this->n=n;
  46. for(int i=; i<=n; i++)
  47. {
  48. G[i].clear();
  49. vis[i]=;
  50. d[i]=INF;
  51. }
  52. edge.clear();
  53. }
  54. void AddEdge(int u, int v, double t, double d)
  55. {
  56. G[u].push_back(edge.size());
  57. edge.push_back(Edge(u, v, t, d));
  58. }
  59. bool dijkstra(double cur)
  60. {
  61. memset(rode, -, sizeof rode);
  62. memset(vis, , sizeof vis);
  63. repu(i,,n+)
  64. d[i] = oo;
  65. priority_queue<qnode> q;
  66. d[st]=0.00;
  67. q.push(qnode(st, ));
  68. while(!q.empty())
  69. {
  70. qnode x=q.top();
  71. q.pop();
  72. if(vis[x.u])
  73. continue ;
  74. vis[x.u]=true;
  75. if(x.u == ed)
  76. return true;
  77. for(int i=; i<G[x.u].size(); i++)
  78. {
  79. Edge& e=edge[G[x.u][i]];
  80. if(e.t <= cur&& d[e.v]>d[x.u]+e.d)
  81. {
  82. ///加条件,保证最大的温度是e.t
  83. d[e.v]=d[x.u]+e.d;
  84. rode[e.v]=x.u;///保存路径
  85. q.push(qnode(e.v, d[e.v]));
  86. }
  87. }
  88. }
  89. return d[ed] < oo;
  90. }
  91. } dij;
  92. void printroad(int x)
  93. {
  94. if(x==st)
  95. {
  96. printf("%d", x);
  97. return ;
  98. }
  99. printroad(rode[x]);
  100. printf(" %d", x);
  101. }
  102. int main()
  103. {
  104. int n,m;
  105. while(~scanf("%d%d",&m,&n))
  106. {
  107. dij.init(m);
  108. scanf("%d%d",&st,&ed);
  109. int u,v;
  110. double c,w;
  111. vector<double> se;
  112. repu(i,,n)
  113. {
  114. scanf("%d%d%lf%lf",&u,&v,&c,&w);
  115. se.push_back(c);
  116. dij.AddEdge(u, v, c, w);
  117. dij.AddEdge(v, u, c, w);
  118. }
  119. sort(se.begin(),se.end());///按照温度排序进行二分
  120. int L = , R = unique(se.begin(),se.end())- se.begin()-;
  121. int mid;
  122. while(L<R)
  123. {
  124. mid=(L+R)/;
  125. if(dij.dijkstra(se[mid]))
  126. R=mid;///如果存在就找更小的温度
  127. else L=mid+;
  128. }
  129. dij.dijkstra(se[R]);///找到的R就是最终的条件
  130. printroad(ed);
  131. printf("\n%.1lf %.1lf\n", dij.d[ed], se[R]);
  132. }
  133. return ;
  134. }

HDU

题意:起点1,终点m,每条道路都有一个最大容量,以及通过的时间,求在时间T内能过的最大的容量;

思路:得用最大流吧,但是可能数据水,跟上一题一样的思路居然也能过。

注意:说代码的话,跟上一题完全一样,除了二分,但我被坑的一点就是二分,L跟R赋值的时候没改掉,就debug其他的地方,花费了不少的时间;

按照从小到大的顺序排好后,进行二分,注意mid = (l + r + 1)/ 2;符合的 l = mid;否则r = mid -1;(这是找越大的越好)---mid为啥+1母鸡啊

按照从小到大的顺序排好后,进行二分,注意mid = (l + r )/ 2;符合的 l = mid - 1;否则r = mid ;(这是找越小的越好)

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <algorithm>
  5. #include <cstring>
  6. #include <cmath>
  7. #include <vector>
  8. #include <queue>
  9. #include <stack>
  10. #include <set>
  11. #include <map>
  12. #define repu(i, a, b) for(int i = (a); i < (b); i++)
  13. using namespace std;
  14. typedef long long LL;
  15. const int maxn=;
  16. const int INF=0x3f3f3f3f;
  17. int rode[maxn];
  18. int st,ed,T;
  19. struct Edge
  20. {
  21. int u, v;
  22. int t, d;
  23. Edge(int u, int v, int t, int d):u(u), v(v), t(t), d(d) {}
  24. };
  25. struct qnode
  26. {
  27. int u;
  28. int d;
  29. qnode(int u, int d):u(u), d(d) {}
  30. bool operator < (const qnode a)const
  31. {
  32. return d > a.d;
  33. }
  34. };
  35. struct Dijkstra
  36. {
  37. int n;
  38. vector<int> G[maxn];
  39. vector<Edge> edge;
  40. int d[maxn];
  41. bool vis[maxn];
  42. void init(int n)
  43. {
  44. this->n=n;
  45. for(int i=; i<=n; i++)
  46. {
  47. G[i].clear();
  48. vis[i]=;
  49. d[i]=INF;
  50. }
  51. edge.clear();
  52. }
  53. void AddEdge(int u, int v, int t, int d)
  54. {
  55. G[u].push_back(edge.size());
  56. edge.push_back(Edge(u, v, t, d));
  57. }
  58. int dijkstra(int cur)
  59. {
  60. memset(vis, , sizeof vis);
  61. repu(i,,n+)
  62. d[i]=i==?:INF;
  63. priority_queue<qnode> q;
  64. d[st]=;
  65. q.push(qnode(st, ));
  66. while(!q.empty())
  67. {
  68. qnode x=q.top();
  69. q.pop();
  70. if(vis[x.u])
  71. continue ;
  72. vis[x.u]=true;
  73. if(x.u == ed)
  74. return d[ed] <= T;
  75. for(int i=; i<G[x.u].size(); i++)
  76. {
  77. Edge& e=edge[G[x.u][i]];
  78. if(e.t >= cur && d[e.v] > d[x.u]+e.d)
  79. {
  80. ///加条件,保证最小的容量是cur
  81. d[e.v]=d[x.u]+e.d;
  82. q.push(qnode(e.v, d[e.v]));
  83. }
  84. }
  85. }
  86. return d[ed] <= T;
  87. }
  88. } dij;
  89. int main()
  90. {
  91. int n,m,I;
  92. scanf("%d",&I);
  93. while(I--)
  94. {
  95. scanf("%d%d%d",&m,&n,&T);
  96. dij.init(m);
  97. st = ;
  98. ed = m;
  99. int u,v;
  100. int c,w;
  101. vector<int> se;
  102. repu(i,,n)
  103. {
  104. scanf("%d%d%d%d",&u,&v,&c,&w);
  105. se.push_back(c);
  106. dij.AddEdge(u, v, c, w);
  107. dij.AddEdge(v, u, c, w);
  108. }
  109. sort(se.begin(),se.end());///按照容量排序进行二分
  110. int L = , R = unique(se.begin(),se.end())- se.begin()-;
  111. int mid;
  112. while(L < R)///居然在这里栽坑了
  113. {
  114. mid=(L + R + )/;
  115. if(dij.dijkstra(se[mid]))
  116. L=mid;///如果存在就找更大的容量
  117. else R=mid-;
  118. }
  119. printf("%d\n", se[L]);
  120. }
  121. return ;
  122. }

UVA 10816 + HDU 1839 Dijstra + 二分 (待研究)的更多相关文章

  1. hdu 1839 Delay Constrained Maximum Capacity Path 二分/最短路

    Delay Constrained Maximum Capacity Path Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu. ...

  2. uva 10004 Bicoloring(dfs二分染色,和hdu 4751代码差不多)

    Description In the ``Four Color Map Theorem" was proven with the assistance of a computer. This ...

  3. hdu 1839 Delay Constrained Maximum Capacity Path(spfa+二分)

    Delay Constrained Maximum Capacity Path Time Limit: 10000/10000 MS (Java/Others)    Memory Limit: 65 ...

  4. HDU 1839

    http://acm.hdu.edu.cn/showproblem.php?pid=1839 题意:从1到n,要求时间小于等于T到达.每条边有一个容量,问最多能运多少货物. 分析:最多能运的货物取决于 ...

  5. UVa 714 Copying Books(二分)

    题目链接: 传送门 Copying Books Time Limit: 3000MS     Memory Limit: 32768 KB Description Before the inventi ...

  6. hdu 2413(最大匹配+二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2413 思路:由于要求最少的时间,可以考虑二分,然后就是满足在limit时间下,如果地球战舰数目比外星战 ...

  7. HDU 5884 Sort (二分)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5884 nn个有序序列的归并排序.每次可以选择不超过kk个序列进行合并,合并代价为这些序列的长度和.总的 ...

  8. UVA 10668 - Expanding Rods(数学+二分)

    UVA 10668 - Expanding Rods 题目链接 题意:给定一个铁棒,如图中加热会变成一段圆弧,长度为L′=(1+nc)l,问这时和原来位置的高度之差 思路:画一下图能够非常easy推出 ...

  9. hdu 1281棋盘游戏(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281   Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘, ...

随机推荐

  1. 20160620001 FileUpload控件获取上传文件的路径

    参考地址: http://bbs.csdn.net/topics/350051517 —————————————————————————————— 用js实现 <%@ Page Language ...

  2. ipad开发:二维码扫描,摄像头旋转角度问题解决办法

    之前一直是在手机上开发,用系统原生二维码扫描功能,一点问题都没有,但是在ipad上,用户是横屏操作的,虽然界面旋转了,是横屏的,但是摄像头里显示的依然是竖屏效果,也就是说从摄像头里看到的和人眼看到的内 ...

  3. easyui datagrid 仿ext—右键

    var createGridHeaderContextMenu = function(e, field) { e.preventDefault(); var grid = $(this);/* gri ...

  4. Tomcat内存设置

    MyEclipse Tomcat的JDK菜单:“Optional Java VM arguments:”框中输入“有前置空格”   -Xms512m -Xmx512m -XX:PermSize=512 ...

  5. Linux sticky bit 目录权限 rwt权限

    [linux权限分为 user group others三组] 今天看到有个目录的权限是rwxrwxrwt 很惊讶这个t是什么,怎么不是x或者-呢?搜了下发现: 这个t代表是所谓的sticky bit ...

  6. Maven学习(四)-- 生命周期和插件

    标签(空格分隔): 学习笔记 Maven生命周期是抽象的,不做任何实际的工作,在Maven的设计中,实际的任务都交由插件来完成. 每个构件步骤都可以绑定一个或者多个插件行为,而且Maven为大多数构建 ...

  7. 微信小程序文件作用域模块引用

    文件作用域 在 JavaScript 文件中声明的变量和函数只在该文件中有效:不同的文件中可以声明相同名字的变量和函数,不会互相影响. 通过全局函数 getApp() 可以获取全局的应用实例,如果需要 ...

  8. 第四章· ucos系统及其任务

    来自为知笔记(Wiz)

  9. python 反射调用

    因为目前在写一个python的项目,用到了Python的反射机制,所以做一下笔记,把写项目过程中的感悟记下来. 先简单介绍下Demo用到的函数: sys.path 是python的模块的路径集,是一个 ...

  10. Eclipse SVN 安装步骤

    1.在eclipse中安装svn插件 Eclipse ---> Help ---> Install New Software ---> Add Name : 任意 Location ...