当前位置: 首页 > news >正文

UVa 10917 林中漫步

https://vjudge.net/problem/UVA-10917

题意:

给出一个图,求出从1走到2共有多少种走法。前提是他只沿着满足如下条件的道路(A,B)走:存在一条从B出发回家的路径,比所有从A出发回家的路径都短。

 

思路:

首先用Dijkstra算法求出每个点到家的最短路径,那么题目的要求也就变成了d[B]<d[A],这样,我们创建了一个新的图,当且仅当d[B]<d[A]时加入有向边A->B,这样就是一个DAG,直接用动态规划计数。

  1 #include <iostream>  
  2 #include <cstring>  
  3 #include <algorithm>   
  4 #include <vector>
  5 #include <queue>
  6 using namespace std;
  7 
  8 const int maxn = 1000 + 5;
  9 const int INF = 0x3f3f3f3f;
 10 
 11 int n, m;
 12 
 13 struct Edge
 14 {
 15     int from, to, dist;
 16     Edge(int u, int v, int d) :from(u), to(v), dist(d){}
 17 };
 18 
 19 struct HeapNode
 20 {
 21     int d, u;
 22     HeapNode(int x, int y) :d(x), u(y){}
 23     bool operator < (const HeapNode& rhs) const
 24     {
 25         return d>rhs.d;
 26     }
 27 };
 28 
 29 struct Dijkstra
 30 {
 31     int n, m;
 32     vector<Edge> edges;
 33     vector<int> G[maxn];
 34     bool done[maxn];
 35     int d[maxn];
 36     int p[maxn];
 37     int dp[maxn];
 38 
 39     void init(int n)
 40     {
 41         this->n = n;
 42         for (int i = 0; i < n; i++)
 43             G[i].clear();
 44         edges.clear();
 45     }
 46 
 47     void AddEdge(int from, int to, int dist)
 48     {
 49         edges.push_back(Edge(from, to, dist));
 50         int m = edges.size();
 51         G[from].push_back(m - 1);
 52     }
 53 
 54     void dijkstra(int s)
 55     {
 56         priority_queue<HeapNode> Q;
 57         for (int i = 0; i < n; i++)  d[i] = INF;
 58         memset(done, 0, sizeof(done));
 59         d[s] = 0;
 60         Q.push(HeapNode(0, s));
 61         while (!Q.empty())
 62         {
 63             HeapNode x = Q.top();
 64             Q.pop();
 65             int u = x.u;
 66             if (done[u])  continue;
 67             done[u] = true;
 68             for (int i = 0; i < G[u].size(); i++)
 69             {
 70                 Edge& e = edges[G[u][i]];
 71                 if (d[e.to]>d[u] + e.dist)
 72                 {
 73                     d[e.to] = d[u] + e.dist;
 74                     p[e.to] = e.from;
 75                     Q.push(HeapNode(d[e.to], e.to));
 76                 }
 77             }
 78         }
 79     }
 80 
 81     int DP(int s)
 82     {
 83         if (s == 1)  return 1;
 84         if (dp[s] != -1)  return dp[s];
 85         dp[s] = 0;
 86         for (int i = 0; i < G[s].size(); i++)
 87         {
 88             Edge e = edges[G[s][i]];
 89             if (d[e.to] < d[s])  dp[s] += DP(e.to);
 90         }
 91         return dp[s];
 92     }
 93 }t;
 94 
 95 int main()
 96 {
 97     //freopen("D:\\input.txt", "r", stdin);
 98     int u, v, d;
 99     while (~scanf("%d", &n) && n)
100     {
101         scanf("%d", &m);
102         t.init(n);
103         for (int i = 0; i < m; i++)
104         {
105             scanf("%d%d%d", &u, &v, &d);
106             t.AddEdge(u - 1, v - 1, d);
107             t.AddEdge(v - 1, u - 1, d);
108         }
109         t.dijkstra(1);
110         memset(t.dp, -1, sizeof(t.dp));
111         t.DP(0);
112         printf("%d\n", t.dp[0]);
113     }
114     return 0;
115 }

 

转载于:https://www.cnblogs.com/zyb993963526/p/6664957.html

相关文章:

  • Ruby 写文件
  • Python学习日记之读取中文目录
  • STL List::sort() 解析
  • 饥饿鲨鱼进化-破解篇
  • 内存操作函数memcpy和memmove详解
  • 【原】STM32的USART与SPI是可以直接通讯
  • django自定义signal的发送和接收样例
  • MVC开发中的常见错误-07-“System.IO.DirectoryNotFoundException”类型的未经处理的异常在 mscorlib.dll 中发生...
  • 你必须要了解的几种排序方法
  • 补交 作业二:个人博客作业内容:需求分析
  • poj-1741 (点分治模板)
  • 分库分表中间件特性分析
  • 百科知识 scm文件如何打开
  • PHP之旅3 php数组以及遍历数组 以及each() list() foreach()
  • Spring配置activemq异步消息监听器
  • 【React系列】如何构建React应用程序
  • 2019.2.20 c++ 知识梳理
  • C++11: atomic 头文件
  • webpack入门学习手记(二)
  • 关于List、List?、ListObject的区别
  • 解决iview多表头动态更改列元素发生的错误
  • 前端相关框架总和
  • 使用 QuickBI 搭建酷炫可视化分析
  • 试着探索高并发下的系统架构面貌
  • 数组的操作
  • 推荐一个React的管理后台框架
  • 线上 python http server profile 实践
  • 学习Vue.js的五个小例子
  • 学习笔记:对象,原型和继承(1)
  • 译有关态射的一切
  • 智能合约Solidity教程-事件和日志(一)
  • 【运维趟坑回忆录】vpc迁移 - 吃螃蟹之路
  • 积累各种好的链接
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • # 数论-逆元
  • #{}和${}的区别?
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (Forward) Music Player: From UI Proposal to Code
  • (python)数据结构---字典
  • (二)hibernate配置管理
  • (四) 虚拟摄像头vivi体验
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • *2 echo、printf、mkdir命令的应用
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .NET6使用MiniExcel根据数据源横向导出头部标题及数据
  • /etc/skel 目录作用
  • /run/containerd/containerd.sock connect: connection refused
  • ;号自动换行
  • @property @synthesize @dynamic 及相关属性作用探究
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [2669]2-2 Time类的定义
  • [ajaxupload] - 上传文件同时附件参数值
  • [Android]Android P(9) WIFI学习笔记 - 扫描 (1)
  • [BSGS算法]纯水斐波那契数列