hdu 1142 A Walk Through the Forest (最短路 + 记忆化搜索)

来源:互联网 发布:windows驱动开发是什么 编辑:程序博客网 时间:2024/04/28 18:36

读题不仔细,一直以为是求长度最短的路由多少条!!

/*“ 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. ”A点能走到B点的条件,是A与B相连,并且A到终点的距离要>B点到终点的距离。所以把终点2当成起点,求出所有点到2的距离。然后DFS出有多少条满足条件的路径 ,记忆化搜索*/
#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;#define M 1000000000int dis[1001],map[1001][1001],vis[1001],n,m,a,b,d,ans,p,h,fa[1001],num[1001];int dfs(int i){    if(i==2)  return 1;    else if(num[i])  return num[i];    int sum=0;    for(int j=1;j<=n;j++)    {        if(map[i][j]!=M&&dis[i]>dis[j])        {            if(num[j])  sum+=num[j];            else sum+=dfs(j);        }    }    num[i]=sum+num[i];    return num[i];}int main(){    while(scanf("%d",&n))    {        if(n==0) break;        scanf("%d",&m);        int i,j;        for(i=1;i<=n;i++)        for(j=1;j<=n;j++)        map[i][j]=M;        for(i=1;i<=m;i++)        {            scanf("%d%d%d",&a,&b,&d);            if(map[a][b]>=d)            {                map[a][b]=d;                map[b][a]=d;            }        }        memset(vis,0,sizeof(vis));        for(i=1;i<=n;i++)        dis[i]=M;        dis[2]=0;        for(i=1;i<=n;i++)        {            int x,mm=M;            for(j=1;j<=n;j++)            {                if(!vis[j]&&dis[j]<=mm)                {                    x=j;                    mm=dis[j];                }            }            vis[x]=1;            for(j=1;j<=n;j++)            dis[j]=min(dis[j],map[x][j]+dis[x]);        }        memset(num,0,sizeof(num));        printf("%d\n",dfs(1));    }    return 0;}


原创粉丝点击