1. 程式人生 > >HDU 1142 A Walk Through the Forest(最短路+記憶化搜索)

HDU 1142 A Walk Through the Forest(最短路+記憶化搜索)

大於 take tin href init sizeof itl any problem

A Walk Through the Forest

Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 10172 Accepted Submission(s): 3701


Problem Description Jimmy experiences a lot of stress at work these days, especially since his accident made working difficult. To relax after a hard day, he likes to walk home. To make things even nicer, his office is on one side of a forest, and his house is on the other. A nice walk through the forest, seeing the birds and chipmunks is quite enjoyable.
The forest is beautiful, and Jimmy wants to take a different route everyday. He also wants to get home before dark, so he always takes a path to make progress towards his house. He considers taking a path from A to B to be progress if there exists a route from B to his home that is shorter than any possible route from A. Calculate how many different routes through the forest Jimmy might take.

Input Input contains several test cases followed by a line containing 0. Jimmy has numbered each intersection or joining of paths starting with 1. His office is numbered 1, and his house is numbered 2. The first line of each test case gives the number of intersections N, 1 < N ≤ 1000, and the number of paths M. The following M lines each contain a pair of intersections a b and an integer distance 1 ≤ d ≤ 1000000 indicating a path of length d between intersection a and a different intersection b. Jimmy may walk a path any direction he chooses. There is at most one path between any pair of intersections.

Output For each test case, output a single integer indicating the number of different routes through the forest. You may assume that this number does not exceed 2147483647

Sample Input 5 6 1 3 2 1 4 2 3 4 3 1 5 12 4 2 34 5 2 24 7 8 1 3 1 1 4 1 3 7 1 7 4 1 7 5 1 6 7 1 5 2 1 6 2 1 0

Sample Output 2 4

Source University of Waterloo Local Contest 2005.09.24

Recommend Eddy | We have carefully selected several similar problems for you: 1217 1385 1548 1596 2112 題目意思: 這道題不是求最短路的條數!!! 註意了 題目是說如果A到終點的距離大於B到終點的距離,那麽我們認為A到B是滿足條件的路徑 問你滿足條件的路的條數 分析: 先用終點做起點然後求單源最短路,得到每個點到終點的距離 然後通過記憶化搜索,搜滿足條件的路徑數目!!! 主要是題目意思難懂,很容易誤解成為求1到2的最短路條數 code:
#include<iostream>
#include<stdio.h>
#include<memory.h>
using namespace std;
#define max_v 1005
#define INF 9999999
int n,m;
int vis[max_v];
int dis[max_v];
int e[max_v][max_v];
int dp[max_v];
void init()
{
    memset(vis,0,sizeof(vis));
    for(int i=0;i<=n;i++)
    {
        for(int j=0;j<=n;j++)
        {
            e[i][j]=INF;
        }
        dp[i]=-1;
        dis[i]=INF;
    }
}
void Dijkstra(int s)
{
    for(int i=1;i<=n;i++)
        dis[i]=e[s][i];
    dis[s]=0;
    for(int i=1;i<=n;i++)
    {
        int index,mindis=INF;
        for(int j=1;j<=n;j++)
        {
            if(!vis[j]&&dis[j]<mindis)
            {
                mindis=dis[j];
                index=j;
            }
        }
        vis[index]=1;
        for(int j=1;j<=n;j++)
            if(dis[index]+e[index][j]<dis[j])
                dis[j]=dis[index]+e[index][j];
    }
}
int dfs(int v)
{
    if(dp[v]!=-1)
        return dp[v];
    if(v==2)
        return 1;
    int sum=0;
    for(int i=1;i<=n;i++)
        if(dis[v]>dis[i]&&e[v][i]!=INF)
             sum+=dfs(i);
    dp[v]=sum;
    return dp[v];
}
int main()
{
    while(~scanf("%d",&n))
    {
        if(!n)
            break;
        scanf("%d",&m);
        init();
        for(int i=0;i<m;i++)
        {
            int x,y,z;
            scanf("%d %d %d",&x,&y,&z);
            if(e[x][y]>z)
                e[x][y]=e[y][x]=z;
        }
        Dijkstra(2);
        printf("%d\n",dfs(1));
    }
    return 0;
}

HDU 1142 A Walk Through the Forest(最短路+記憶化搜索)