您的位置:首页 > 其它

hdu1142(最短路+DFS)

2017-08-08 21:35 106 查看
题目大意:寻找一共有多少条符合题意的路。能够从点A走到点B的要求是:点A到终点的最短路 > 点B到终点的最短路。 也就是说:从终点出发,求每一个点的最短路,然后那些最短路的值记录起来,作为能否通过的判断条件。最后用记忆化搜索来搜索出一共多少条符合要求的路。普通的dfs是超时的,bfs是超内存的。

#include <stdio.h>  

#include <string.h>  

#include <algorithm>  

using namespace std;  

  

const int inf = 999999999;  

int map[1005][1005];  

int dis[1005],vis[1005];  

int path[1005];  

int n,m;  

  

void Dijkstra(int src)  

{  

    int i,j,minn,pos;  

    memset(vis,0,sizeof(vis));  

    for(i = 0; i<=n; i++)  

        dis[i] = map[src][i];  

    dis[src] = 0;  

    vis[src] = 1;  

    for(i = 1; i<=n; i++)  

    {  

        minn = inf;  

        pos = 0;  

        for(j = 1; j<=n; j++)  

        {  

            if(minn>dis[j] && !vis[j])  

                minn = dis[pos = j];  

        }  

        vis[pos] = 1;  

        for(j = 1; j<=n; j++)  

            if(dis[j]>dis[pos]+map[pos][j] && !vis[j])  

                dis[j] = dis[pos]+map[pos][j];  

    }  

}  

  

int DFS(int src)  

{  

    if(path[src] !=-1)  

        return path[src];  

    if(src == 2)  

        return 1;  

    path[src] = 0;  

    for(int i = 1; i<=n; i++)  

    {  

        if(dis[i]<dis[src] && map[i][src]!=inf)  

            path[src]+=DFS(i);  

    }  

    return path[src];  

}  

  

int main()  

{  

    int i,j,x,y,z;  

    while(~scanf("%d",&n),n)  

    {  

        scanf("%d",&m);  

        for(i = 0; i<=n; i++)  

        {  

            for(j = 0; j<=n; j++)  

                map[i][j] = inf;  

            map[i][i] = 0;  

        }  

        for(i = 0; i<m; i++)  

        {  

            scanf("%d%d%d",&x,&y,&z);  

            map[x][y] = map[y][x] = z;  

        }  

        Dijkstra(2);  

        memset(path,-1,sizeof(path));  

        printf("%d\n",DFS(1));  

    }  

  

    return 0;  

}  

/*******************************

今天早点回去,想吹吹笛子了,最近喜欢看游记,买了瓦尔登湖的中英文版,希望可以坚持看完
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: