layout: post

title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

author: "luowentaoaa"

catalog: true

mathjax: true

tags:

- 最短路

- 基础DP

- Dijkstra

- 图论

- 训练指南


Walk Through the Forest UVA - 10917

题意

Jimmy打算每天沿着一条不同的路走,而且,他只能沿着满足如下条件的道路(A,B):存在一条从B出发回家的路径,比所以从A出发回家的路径都短,你的任务是计算有多少条不同的路径

题意

题意就转化成如果终点到i 比到j的路劲短,就连线,然后记忆化搜索就行(这几天这种题做太多次了)

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const ll mod=998244353;
  5. const int maxn=1050;
  6. const ll inf=0x3f3f3f3f3f3f3f3fLL;
  7. struct Edge{
  8. int from,to,dist;
  9. };
  10. struct HeapNode{
  11. int d,u;
  12. bool operator <(const HeapNode& rhs)const{
  13. return d>rhs.d;
  14. }
  15. };
  16. struct Dijkstra{
  17. int n,m; ///点数和边数 点编号0~N-1
  18. vector<Edge>edges; ///边列表
  19. vector<int>G[maxn]; ///每个节点出发的边编号
  20. bool done[maxn]; /// 是否已永久标号
  21. int d[maxn]; /// s到各个点的距离
  22. int p[maxn]; /// 最短路中的上一条边
  23. void init(int n){
  24. this->n=n;
  25. for(int i=0;i<n;i++)G[i].clear();
  26. edges.clear();
  27. }
  28. void AddEdge(int from,int to,int dist){ ///无向图调用两次
  29. edges.push_back((Edge){from,to,dist});
  30. m=edges.size();
  31. G[from].push_back(m-1);
  32. }
  33. void dijkstra(int s){
  34. priority_queue<HeapNode>Q;
  35. for(int i=0;i<n;i++)d[i]=inf;
  36. d[s]=0;
  37. memset(done,0,sizeof(done));
  38. Q.push((HeapNode){0,s});
  39. while(!Q.empty()){
  40. HeapNode x=Q.top();Q.pop();
  41. int u=x.u;
  42. if(done[u])continue;
  43. done[u]=true;
  44. for(int i=0;i<G[u].size();i++){
  45. Edge& e=edges[G[u][i]];
  46. if(d[e.to]>d[u]+e.dist){
  47. d[e.to]=d[u]+e.dist;
  48. p[e.to]=G[u][i];
  49. Q.push((HeapNode){d[e.to],e.to});
  50. }
  51. }
  52. }
  53. }
  54. /// dist[i]为s到i的距离,paths[i]为s到i的最短路径(经过的结点列表,包括s和t)
  55. void GetShortestPaths(int s,int* dist,vector<int>* paths){///paths是二维链表
  56. dijkstra(s);
  57. for(int i=0;i<n;i++){
  58. dist[i]=d[i];
  59. paths[i].clear();
  60. int t=i;
  61. paths[i].push_back(t);
  62. while(t!=s){
  63. paths[i].push_back(edges[p[t]].from);
  64. t=edges[p[t]].from;
  65. }
  66. reverse(paths[i].begin(),paths[i].end());
  67. }
  68. }
  69. };
  70. Dijkstra solver;
  71. int d[maxn];
  72. int dp(int u){
  73. if(u==1)return 1;
  74. int &ans=d[u];
  75. if(ans>=0)return ans;
  76. ans=0;
  77. for(int i=0;i<solver.G[u].size();i++){
  78. int v=solver.edges[solver.G[u][i]].to;
  79. if(solver.d[v]<solver.d[u])ans+=dp(v);
  80. }
  81. return ans;
  82. }
  83. int main()
  84. {
  85. std::ios::sync_with_stdio(false);
  86. std::cin.tie(0);
  87. std::cout.tie(0);
  88. int n,m;
  89. while(cin>>n){
  90. if(n==0)break;
  91. cin>>m;
  92. solver.init(n);
  93. for(int i=0;i<m;i++){
  94. int a,b,c;
  95. cin>>a>>b>>c;a--;b--;
  96. solver.AddEdge(a,b,c);
  97. solver.AddEdge(b,a,c);
  98. }
  99. solver.dijkstra(1);
  100. memset(d,-1,sizeof(d));
  101. cout<<dp(0)<<endl;
  102. }
  103. return 0;
  104. }

训练指南 UVA - 10917(最短路Dijkstra + 基础DP)的更多相关文章

  1. 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板)

    layout: post title: 训练指南 UVA - 11374(最短路Dijkstra + 记录路径 + 模板) author: "luowentaoaa" catalo ...

  2. 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环)

    layout: post title: 训练指南 UVA - 11090(最短路BellmanFord+ 二分判负环) author: "luowentaoaa" catalog: ...

  3. 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束)

    layout: post title: 训练指南 UVA - 11478(最短路BellmanFord+ 二分+ 差分约束) author: "luowentaoaa" catal ...

  4. 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)

    layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...

  5. 训练指南 UVA - 11419(二分图最小覆盖数)

    layout: post title: 训练指南 UVA - 11419(二分图最小覆盖数) author: "luowentaoaa" catalog: true mathjax ...

  6. 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y))

    layout: post title: 训练指南 UVA - 11383(KM算法的应用 lx+ly >=w(x,y)) author: "luowentaoaa" cata ...

  7. 训练指南 UVA - 11354(最小生成树 + 倍增LCA)

    layout: post title: 训练指南 UVA - 11354(最小生成树 + 倍增LCA) author: "luowentaoaa" catalog: true ma ...

  8. 算法竞赛入门经典训练指南——UVA 11300 preading the Wealth

    A Communist regime is trying to redistribute wealth in a village. They have have decided to sit ever ...

  9. uva 10917 最短路+dp

    https://vjudge.net/problem/UVA-10917 给出N点M边的无向图,没重边.对于点A,B,当且仅当从B到终点的最短路小于任何一条从A到终点的最短路时,才考虑从A走到B,否则 ...

随机推荐

  1. Exponial~(欧拉函数)~(发呆题)

    Description Everybody loves big numbers (if you do not, you might want to stop reading at this point ...

  2. tyvj1305 最大子序和(单调队列

    题目地址:http://www.joyoi.cn/problem/tyvj-1305 最大子序和 题目限制 时间限制 内存限制 评测方式 题目来源 1000ms 131072KiB 标准比较器 Loc ...

  3. noip车站分级 拓扑排序

    题目传送门 这道题呢 每次输入一段数就把1~n里面没有在这组数里面的数和他们连一波 表示这些数比他们等级低 然后就搞一搞就好了哇 #include<cstdio> #include< ...

  4. Web Application Vulnerabilities and Potential Problem Due to Bad Design

    web应用设计中不安全的设计及潜在的风险: REF: https://msdn.microsoft.com/en-us/library/ff648647.aspx

  5. eclipse使用git下载项目

    准备工作: 目的:从远程仓库github上down所需的项目 eclipse使用Git插件下载github上项目 eclipse版本:eclipse4.5  64位 jdk版本:jdk-1.7 64位 ...

  6. Python小程序之用户登陆接口

    编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 程序逻辑图: 代码: #!/usr/bin/env python #_*_ coding:UTF-8 _*_ #__author_ ...

  7. linux基础的基础命令操作

    一.开启Linux操作系统,要求以root用户登录GNOME图形界面,语言支持选择为汉语 操作:su - root 二.使用快捷键切换到虚拟终端2,使用普通用户身份登录,查看系统提示符 操作:ctrl ...

  8. 嵌入式上 iscsi实现

    前言 去年公司设备(haisi3516)上需要提供iscsi的功能,于是花了几天时间探究了下.linux内核(2.6.xx)支持iscsi,只是我发现当时我们设备的内核编译时没有选上,于是重新编译了内 ...

  9. 使用Python获取计算机名,ip地址,mac地址等等

    获取计算机名 # 获取计算机名,常用的方法有三种 import os import socket # method one name = socket.gethostname() print(name ...

  10. 【SQL】约束与触发器1

    一.外键 1.1特点 表A的外键,一定是其他某个表B的主键或有UNIQUE声明的属性. A的外键的值,一定是对应表B中相应的属性值.(空值除外) 1.2声明方法 方法1:属性名 类型 REFERENC ...