HDU 1142(djstar+记忆化搜索)
2015-08-03 10:43
585 查看
题意不是问最短路有多少条,而是问从下一个点出发有多少条路比从当前点出发到2(终点)要短?? 最短路算法方面是直接套用的模板,不过这次不是先求终点到各点的最短路,再从源点进行搜索。
#include<stdio.h> #include<string.h> #include<vector> #include<queue> using namespace std; const int N=1100; const int INF=0x3f3f3f3f; struct node { int u,d; int operator<(const node x)const { return x.d<d; } }; struct maps { int v,w; }edge[N*N]; vector<int> g ; int n,s,cnt,d ,dp ; void init() { for(int i=0;i<N;i++) { g[i].clear(); d[i]=INF; } cnt=0; memset(dp,0,sizeof(dp)); } void add(int u,int v,int w) { edge[cnt].v=v,edge[cnt].w=w; g[u].push_back(cnt++); } void dijstar(int s) { priority_queue<node> q; node cur,next; cur.u=s,cur.d=0; d[s]=0; q.push(cur); maps e; int i,u; while(!q.empty()) { cur=q.top(); q.pop(); u=cur.u; if(d[u]!=cur.d) continue; for(i=0;i<g[u].size();i++) { e=edge[g[u][i]]; if(d[e.v]>d[u]+e.w) { d[e.v]=d[u]+e.w; next.u=e.v,next.d=d[e.v]; q.push(next); } } } } int dfs(int u) { if(u==2) return 1; if(dp[u]) return dp[u]; int tmp=0; for(int i=0;i<g[u].size();i++) { int v=edge[g[u][i]].v; if(d[v]<d[u]) { tmp+=dfs(v); } } dp[u]=tmp; return dp[u]; } int main() { int m,i,u,v,w; while(scanf("%d",&n)!=EOF&&n) { scanf("%d",&m); init(); while(m--) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,w); } dijstar(2); printf("%d\n",dfs(1)); } return 0; }
相关文章推荐
- javascript实现超炫的向上滑行菜单实例
- Javascript原型和原型链
- JavaScript 基础工具清单
- extjs类继承图之数据源(2)
- Extjs DateField Bug 当format为年月'Y-m',在当前月(30、31号)选择其他偶数月会乱跳的问题解决方案
- 【阅读】《head first html5》第十章——《运用javascript》(实际上的javascript线程)
- JS判断是什么设备是什么浏览器-主要用移动页面开发
- Angular Js ng-repeat指令
- Javascript刷新页面的几种方法
- JS拖拽插件实现步骤
- js闭包初体验
- javascript实现的淘宝旅行通用日历组件用法实例
- jsp路径问题
- Jsoup
- javascript简单实现类似QQ头像弹出效果的方法
- URL、枚举和XML解析、Json解析(8.3)
- js时间日期的添加方法
- Javascript实例教程:querySelector()方...
- js数组去重
- JavaScript权威指南_146_第15章_脚本化文档_15.10-其他文档特性-Document的属性