hdu1142(最短路+记忆化搜索)
2015-06-10 20:24
399 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1142
题目意思挺模糊
大致思路,以终点为源点,做一次单源最短路
深搜一遍图(下一步到达的位置 比现在位置 离终点更近)
记录每个节点上可行数
题目意思挺模糊
大致思路,以终点为源点,做一次单源最短路
深搜一遍图(下一步到达的位置 比现在位置 离终点更近)
记录每个节点上可行数
#include <bits/stdc++.h> struct Edge { int v, w; Edge(int _v, int _w): v(_v), w(_w){} }; const int MAXN = 1000 + 10; std::vector<Edge> E[MAXN]; int n, m, dp[MAXN]; bool vis[MAXN]; int dist[MAXN]; void init() { memset(vis, false, sizeof(vis)); memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; ++ i){ dist[i] = 1<<30; E[i].clear(); } } void addEdge(int a, int b, int d) { E[a].push_back(Edge(b, d)); E[b].push_back(Edge(a, d)); } void spfa(int start) { vis[start] = true; dist[start] = 0; std::queue<int> que; que.push(start); while(que.empty()==false){ int u = que.front(); que.pop(); vis[u] = false; for(int i = 0; i < E[u].size(); ++ i){ int v = E[u][i].v; int w = E[u][i].w; if(dist[v] > dist[u] + w){ dist[v] = dist[u] + w; if(vis[v] == false){ que.push(v); } } } } } int dfs(int u) { if(u == 2) return 1; if(dp[u] > 0){ return dp[u]; } for(int i = 0; i < E[u].size(); ++ i){ int v = E[u][i].v; if(dist[u] > dist[v]){ dp[u] += dfs(v); } } return dp[u]; } int main() { while(scanf("%d", &n) && n){ scanf("%d", &m); init(); for(int i = 1; i <= m; ++ i){ int a, b, d; scanf("%d%d%d", &a, &b, &d); addEdge(a, b, d); } spfa(2); printf("%d\n", dfs(1)); } }
相关文章推荐
- (leetcode)Remove Duplicates from Sorted List
- Xcode6在iPhone5+iOS7模拟器上编译,上下有黑边问题
- System权限下进程遇到的问题以及如何降权启动进程
- 【VB.NET机房重构】SQLHelper--数据库小助手
- Majority Element
- 我们都爱大长腿
- Algorithms—22.Generate Parentheses
- XX项目总结
- uva 10397 Connect the Campus(最小生成树kruskal)
- 二进制bomb实验第三弹
- android:layout_gravity 和 android:gravity 的区别
- sprintf函数
- Canjs基础教程之Controls
- HDU - 2059 龟兔赛跑(多阶段决策dp)
- 线程与进程的区别
- oracle record is locked by another user
- DFS Path Sum II
- 仿英语流利说取词放大控件的实现
- Java——(四)Collection之Set集合TreeSet类
- 修改input的type属性