hdu-1142-A Walk Through the Forest
2015-08-17 14:21
561 查看
就是从1到2之间,下一点到2的距离比当前点到2的距离要短,问这样的路径有多少条。
最短路径+记忆化搜索解决
最短路径+记忆化搜索解决
#include<iostream> #include<cstring> using namespace std; const int MAX=1001; const int INF=99999999; int m,n; int map[MAX][MAX]; int dis[MAX]; int use[MAX]; void Init() { memset(use,0,sizeof(use)); for(int i=1; i<MAX; i++) for(int j=1; j<MAX; j++) map[i][j]=map[j][i]=INF; } void dijkstra(int s) { bool vis[MAX]; memset(vis,false,sizeof(vis)); int pos=s; vis[pos]=true; dis[pos]=0; for(int i=1; i<=n; i++) if(i!=pos) dis[i]=map[pos][i]; for(int i=1; i<n; i++) { int min=INF; for(int j=1; j<=n; j++) { if(!vis[j]&&dis[j]<min) { min=dis[j]; pos=j; } } vis[pos]=true; for(int k=1; k<=n; k++) { if(!vis[k]&&dis[k]>dis[pos]+map[pos][k]) dis[k]=dis[pos]+map[pos][k]; } } } int dfs(int x) { int sum=0; if(x==2) return 1; if(use[x]) return use[x]; for(int i=1; i<=n; i++) { if(map[x][i]!=INF&&dis[x]>dis[i]&&x!=i) { sum+=dfs(i); } } use[x]=sum; return use[x]; } int main() { int a,b,time; while(cin>>n&&n!=0) { cin>>m; Init(); for(int i=1; i<=m; i++) { cin>>a>>b>>time; if(map[a][b]>time||map[b][a]>time) map[a][b]=map[b][a]=time; } dijkstra(2); cout<<dfs(1)<<endl; } }
相关文章推荐
- 关于Java中的静态块,非静态块,子类父类的静态块,非静态块的执行顺序
- Oracle学习笔记
- CF_567B_BerlandNationalLibrary
- call和apply的深入理解
- B305第二周工作周报
- io口的作用
- What is "jar.mn"?
- MySQL学习笔记-数据库后台线程
- Hive中排序和聚集
- 基线baseline
- Android 动画详解
- PHP与JSON
- 如何用C语言画一个高逼格的"心形"?
- android sdk 离线安装
- 获取Android手机SD卡容量大小
- ARC与MRC的性能对比
- Java异常分类
- vu 是什么
- 《Java设计模式》之代理模式
- 黑马程序员——JAVA基础——集合