HDU 1142--最短路 SPFA+DFS记忆化搜索

http://acm.hdu.edu.cn/showproblem.php?pid=1142

这题题目看了非常久,英文不好伤不起啊。。

题意:看样子很多人都把这题目看错了,以为是求最短路的条数。真正的意思是:假设 A 和 B 是相连的,当前在 A 处,如果 A 到终点的距离大于 B 到终点的距离,则可以从 A 通往 B 处,问满足这种的条件的路径条数。

分析:1、以终点 2 为起点 SPFA;
     2、直接DFS记忆化搜索。
复制代码
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 using namespace std;
 5 #define maxn 1005
 6 #define INF 0x3f3f3f3f
 7 int vis[maxn],dist[maxn],g[maxn][maxn],n,s[maxn];
 8 void spfa()
 9 {
10     int i;
11     queue<int> q;
12     memset(vis,0,sizeof(vis));
13     for(i=1;i<=n;i++)
14         dist[i]=INF;
15     dist[2]=0;
16     q.push(2);
17     while(!q.empty())
18     {
19         int k=q.front();
20         vis[k]=0;
21         for(i=1;i<=n;i++)
22         {
23             if(dist[i]>dist[k]+g[k][i])
24             {
25                 dist[i]=dist[k]+g[k][i];
26                 if(!vis[i])
27                 {
28                     q.push(i);
29                     vis[i]=1;
30                 }
31             }
32         }
33         q.pop();
34     }
35 }
36 int dfs(int now)
37 {
38     if(now==2)
39         return 1;
40     if(s[now])
41         return s[now];
42     for(int i=1;i<=n;i++)
43     {
44         if(g[now][i]<INF&&dist[now]>dist[i])
45             s[now]+=dfs(i);
46     }
47     return s[now];
48 }
49 int main()
50 {
51     int m,i,j,a,b,w;
52     while(scanf("%d",&n),n)
53     {
54         scanf("%d",&m);
55         for(i=1;i<=n;i++)
56             for(j=1;j<=n;j++)
57                 g[i][j]=i==j?0:INF;
58         while(m--)
59         {
60             scanf("%d %d %d",&a,&b,&w);
61             if(g[a][b]>w)
62                 g[a][b]=g[b][a]=w;
63         }
64         spfa();
65         memset(s,0,sizeof(s));
66         printf("%d\n",dfs(1));
67     }
68     return 0;
69 }
复制代码

 

posted on 2013-02-04 20:22  acoderworld  阅读(49)  评论(0)    收藏  举报

努力加载评论中...

导航

点击右上角即可分享
微信分享提示