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  阅读(50)  评论(0)    收藏  举报

编辑推荐:
· InnoDB为什么不用跳表,Redis为什么不用B+树?
· 记一次 C# 平台调用中因非托管 union 类型导致的内存访问越界
· [EF Core]聊聊“复合”属性
· 那些被推迟的 C# 14 特性及其背后的故事
· 我最喜欢的 C# 14 新特性
阅读排行:
· 微软开源的 MCP 教程「GitHub 热点速览」
· 记一次 .NET 某汽车控制焊接软件 卡死分析
· 博客园出海记-开篇:扬帆启航
· InnoDB为什么不用跳表,Redis为什么不用B+树?
· 记一次C#平台调用中因非托管union类型导致的内存访问越界
< 2025年8月 >
27 28 29 30 31 1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31 1 2 3 4 5 6

导航

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