首页 > 代码库 > 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)