首页 > 代码库 > HDU - 1142 A Walk Through the Forest(Dijkstra+DFS)
HDU - 1142 A Walk Through the Forest(Dijkstra+DFS)
题目链接: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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。