标签:i++ 记忆化搜索 log forest c++ space oid end logs
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1142
题意:从1到达2,路径要尽可能短(就先一遍dijkstra),并且要求每次距离2的路径要比上一个点距离2的路径近,求有多少符合条件的线路。
以2为起始点先进行一遍dijkstra,然后再从1开始dfs,寻找符合条件的线路(就是可以搜到2的线路)。
#include <bits/stdc++.h> using namespace std; const int INF=0x3f3f3f3f; const int N=1111; int E[N][N]; int d[N],path[N]; int n,m; //邻接矩阵存图 void init(){ for(int i=0;i<N;i++) for(int j=0;j<N;j++) if(i==j) E[i][j]=0; else E[i][j]=INF; for(int i=0;i<N;i++) path[i]=-1; for(int i=0;i<N;i++) d[i]=INF; } //记忆化搜索,如果能找到2就返回1,否则就是0. int dfs(int T){ if(path[T]!=-1) return path[T]; if(T==2) return 1; path[T]=0; for(int i=1;i<=n;i++){ //从这个点遍历所有的点,两个点之间如果想通,并且距离2更近,就加入进去。 if(d[T]>d[i]&&E[i][T]!=INF) path[T]+=dfs(i); } return path[T]; } int main(){ while(cin>>n&&n!=0){ cin>>m; init(); int x,y,z; for(int i=1;i<=m;i++){ cin>>x>>y>>z; E[x][y]=E[y][x]=z; } int s=2; priority_queue < pair<int,int> > Q; d[s]=0; Q.push(make_pair(-d[s],s)); while(!Q.empty()){ int now=Q.top().second; Q.pop(); for(int i=1;i<=n;i++){ if(d[i]>d[now]+E[now][i]){ d[i]=d[now]+E[now][i]; Q.push(make_pair(-d[i],i)); } } } cout<<dfs(1)<<endl; } return 0; }
HDU - 1142 A Walk Through the Forest(Dijkstra+DFS)
标签:i++ 记忆化搜索 log forest c++ space oid end logs
原文地址:http://www.cnblogs.com/Leonard-/p/7117411.html