1. 程式人生 > >HDU - 1142 A Walk Through the Forest(Dijkstra+DFS)

HDU - 1142 A Walk Through the Forest(Dijkstra+DFS)

names sin mes 兩個 blog 如果能 const esp c++

題目鏈接: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)