HDU 1142(SPFA+dfs+dp)

开始把dp清0函数写在dfs里面,结果一直T。。。。。。放在主函数里面0ms瞬秒了。。。。。。

题意:给你一个图,求从点1到点2有多少种不同的走法,并且每种走法都必须往点2更近的方向走。(也就是说下一个点必须比当前点更接近点2)

思路:因为必须往点2更近的方向走,所以第一步必须先求出点2到每一个点的最短路径。用SPFA算法。

            设定一个DP数组,DP[i] 表示第i点到点2有多少种符合条件的走法。然后用递归的方法从1点求出到2点的符合条件的走法。具体思想看代码。

 


 

/******************************
* author :crazy_石头
* data structure: SPFA+dfs+dp
* created time:2013/11/5 22:22
* Pro:HDU 1142
* Judge Status:Accepted
* Memory:628K
* Time:0MS
*******************************/

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>

using namespace std;

#define rep(i,h,n) for(int i=(h);i<=(n);i++)
#define INF 0xfffffff

const int maxn=1000+5;

struct Edge
{
    int to,next;
    int cost;
}edge[maxn*maxn];

int dis[maxn],vis[maxn],head[maxn];
int dp[maxn];

int cnt;
int n,m;
inline void addedge(int u,int v,int w)
{
    edge[cnt].to=v;
    edge[cnt].next=head[u];
    edge[cnt].cost=w;
    head[u]=cnt++;
}

inline void makemap(int u,int v,int w)
{
    addedge(u,v,w);
    addedge(v,u,w);
}


inline void SPFA(int s)
{
    queue<int> q;
    rep(i,1,n)
        dis[i]=INF;
    memset(vis,0,sizeof(vis));

    q.push(s);
    dis[s]=0;
    vis[s]=1;

    while(!q.empty())
    {
        int u=q.front();
        q.pop();
        vis[u]=0;

        for(int i=head[u];~i;i=edge[i].next)
        {
            int v=edge[i].to;
            if(dis[v]>dis[u]+edge[i].cost)
            {
                dis[v]=dis[u]+edge[i].cost;
                if(!vis[v])
                {
                    vis[v]=1;
                    q.push(v);
                }
            }
        }
    }
}

inline int dfs(int u)
{
    if(u==2)//找到终点返回;
        return 1;
    if(dp[u])
        return dp[u];

    for(int i=head[u];~i;i=edge[i].next)
    {
        int v=edge[i].to;
        if(dis[v]<dis[u])
        dp[u]+=dfs(v);
    }
    return dp[u];
}

inline void init()
{
    memset(head,-1,sizeof(head));
    cnt=0;
}

int main()
{
    while(~scanf("%d",&n))
    {
        if(n==0)
            break;
        scanf("%d",&m);
        init();
        while(m--)
        {
            int u,v,w;
            scanf("%d%d%d",&u,&v,&w);
            makemap(u,v,w);
        }
        SPFA(2);
        memset(dp,0,sizeof(dp));
        int ret=dfs(1);
        printf("%d\n",ret);
    }
    return 0;
}

* This source code was highlighted by YcdoiT. ( style: Manni )

 

你可能感兴趣的:(HDU 1142(SPFA+dfs+dp))