码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1142(spfa+DFS记忆化)

时间:2015-08-19 16:20:12      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

这道题因为英语渣半天没看懂题意,后来在网上找了一些题解发现,好多人题意理解错了,但是代码交上去能过。

最后终于找到了一个能说明白的题解。

链接:http://www.cnblogs.com/ruihua852/archive/2012/08/27/2658910.html

 

下面是粘贴的链接中的题意:

题目意思是说一个人要从上班的地方回到家里,途中会经过一些地方,按下面规则问他回家会有几种路线:

题目已经定义好1为上班地方2为家,每个地点之间的距离都已经知道,哪么如果从A到B的一条路,可以走的条件

是B到2(家)的路程必须小于从A到2(家)的路程,其实就是A到家的最短路径必须大于B到家的最短路径。

默认一定可以走到家,也就是一定会有一种路线。最后是让你计算有几种路线。

 

下面是我自己的代码。链接中的题解使用dijkstra,而我用了spfa,因为spfa用得少,就想熟悉一下。

#include <iostream>
#include <stdio.h>
#include <vector>
#include <queue>
#include <memory.h>
#define INF 10000000
using namespace std;
struct node
{
    int e,w;
    node(int ee,int ww):e(ee),w(ww){}
    node(){}
};
int dp[1005];
vector<vector<node> > v;
int dist[1005];
int N,M;
void spfa(int S)
{
    for(int i=1;i<=N;i++)
    {
        dist[i]=INF;
    }
    dist[S]=0;
    queue<int> Q;
    Q.push(S);
    while(!Q.empty())
    {
        int s=Q.front();
        Q.pop();
        for(int i=0;i<v[s].size();i++)
        {
            int e=v[s][i].e;
            if(dist[s]+v[s][i].w<dist[e])
            {
                dist[e]=dist[s]+v[s][i].w;
                Q.push(e);
            }
        }
    }
}
int DFS(int S)
{
    if(dp[S])
        return dp[S];
    if(S==2)
        return 1;
    for(int i=0;i<v[S].size();i++)
    {
        if(dist[v[S][i].e]<dist[S])
            dp[S]+=DFS(v[S][i].e);
    }
    return dp[S];
}
int main()
{
    int a,b,c;
    while(scanf("%d",&N)&&N)
    {
        v.clear();
        v.resize(N+1);
        memset(dp,0,sizeof(dp));
        scanf("%d",&M);
        while(M--)
        {
            scanf("%d%d%d",&a,&b,&c);
            v[a].push_back(node(b,c));
            v[b].push_back(node(a,c));
        }
        spfa(2);
        cout<<DFS(1)<<endl;
    }
    return 0;
}

  

hdu1142(spfa+DFS记忆化)

标签:

原文地址:http://www.cnblogs.com/modengdubai/p/4742283.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!