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) 收藏 举报