HDU - 1142 A Walk Through the Forest

来源:互联网 发布:java阻塞队列使用场景 编辑:程序博客网 时间:2024/06/16 09:08
题意:英语着急的题目,看了别人的解释,给个图,让你求最短路,然后找出满足下列条件的个数:假设 A 和 B 是相连的,当前在 A 处,如果 A 到终点的距离大于 B 到终点的距离,
则可以从 A 通往 B 处,问满足这种的条件的路径条数。

思路:再用最短路处理完后,就是求满足条件的个数,这里用到了记忆化搜索减少搜索

用dp[i]来表示i开始的满足条件的个数

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXN = 1010;const int INF = 1000000;int num,road,map[MAXN][MAXN],dis[MAXN],dp[MAXN];int vis[MAXN];void dijkstra(int start){int t,k;memset(vis,0,sizeof(vis));for (int i = 1; i <= num; i++)dis[i] = map[start][i];dis[start] = 0;vis[start] = 1;for (int i = 1; i <= num; i++){t = INF;for (int j = 1; j <= num; j++)if (!vis[j] && t > dis[j])t = dis[k=j];if (t == INF)break;vis[k] = 1;for (int j = 1; j <= num; j++)if (!vis[j] && dis[j] > dis[k]+map[k][j])dis[j] = dis[k] + map[k][j];}}int dfs(int v){int sum = 0;if (dp[v] != -1)return dp[v];if (v == 2)return 1;for (int i = 1; i <= num; i++)if (map[v][i] != INF && dis[v] > dis[i])sum += dfs(i);dp[v] = sum;return dp[v];}int main(){int x,y,cost;while (scanf("%d",&num) != EOF && num){scanf("%d",&road);for (int i = 1; i <= num; i++){dp[i] = -1;for (int j = 1; j <= num; j++)map[i][j] = INF;}for (int i = 1; i <= road; i++){scanf("%d%d%d",&x,&y,&cost);map[x][y] = map[y][x] = cost;}dijkstra(2);printf("%d\n",dfs(1));}return 0;}



0 0