HDU 1142 A Walk Through the Forest

最短路 + 记忆化搜索dfs

科普一下 spfa 

http://hi.baidu.com/qw4365/item/f9a4fa3077224df4a9842809

View Code
#include <stdio.h>
#include <string.h>
#include <algorithm>
using std::sort;

const int INF = (1<<30)-1, MAXN = 1005;
bool set[MAXN];
int dis[MAXN], n, m, r[MAXN][MAXN], cnt, count[MAXN];
struct node
{
    int dis, index;
}nDis[MAXN];
void dij(int src)
{
    int i, j, min, pos;
    for(i=1; i<=n; i++)
        dis[i] = r[src][i];
    memset(set, 0 ,sizeof(set));
    dis[src] = 0;
    for(i=1; i<=n; i++)
    {
        min = pos = INF ;
        for(j=1; j<=n; j++)
            if(!set[j] && min > dis[j])
            {    min = dis[j], pos = j; }
        if(pos == INF)
            return ;
        set[pos] = 1;
        for(j=1; j<=n; j++)
            if(!set[j] && dis[j] > dis[pos] + r[pos][j])
                    dis[j] = dis[pos] + r[pos][j];
    }
}
int dfs(int t)
{
    if(dis[t] == 0)
    {
        return 1;
    }
    if( count[t] > 0 ) return count[t];
    for(int i=1; i<=n; i++)
    {
        if(r[t][i]!=INF && dis[i] < dis[t])
            count[t] += dfs(i);
    }
    return count[t];
}
int main()
{
    int a, b, c, i, j;
    while(scanf("%d", &n), n!=0)
    {
        scanf("%d", &m);
        memset(count, 0, sizeof(count));
        for(i=1; i<=n; i++)
            for(j=1; j<=n; j++)
                r[i][j] = r[j][i] = INF;
        for(i=1; i<=m; i++)
        {
            scanf("%d %d %d", &a, &b, &c);
            r[a][b] = r[b][a] = c;
        }
        dij(2);
        dfs(1);
        printf("%d\n", count[1]);
    }
    return 0;
}

 

posted @ 2013-03-10 14:11  April_Tsui  阅读(140)  评论(0编辑  收藏  举报