hdu 1142 记忆化搜索

题目是这样的,貌似一开始我这个英语搓的人还理解错了。。。orz

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

就是最短路,只不过用dijkstra是从终点到源点,然后再dfs从源点开始搜。。。

好吧,这个记忆化搜索还是挺好用的。。。

View Code
 1 #include<iostream>

 2 #include<cstring>

 3 const int N=1010;

 4 const int inf=99999999;

 5 using namespace std;

 6 

 7 int edge[N][N];

 8 int dist[N];

 9 int visited[N],s[N];

10 int n,m;

11 

12 void Dijkstra(int v0){

13     memset(visited,0,sizeof(visited));

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

15         dist[i]=edge[v0][i];

16     }

17     dist[v0]=0;

18     visited[v0]=1;

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

20         int min=inf,u=v0;

21         for(int j=1;j<=n;j++){

22             if(!visited[j]&&dist[j]<min)

23                 u=j,min=dist[j];

24         }

25         if(min==inf)return ;

26         visited[u]=1;

27         for(int k=1;k<=n;k++){

28             if(!visited[k]&&edge[u][k]<inf&&dist[u]+edge[u][k]<dist[k]){

29                 dist[k]=edge[u][k]+dist[u];

30             }

31         }

32     }

33 }

34 //记忆化搜索

35 int dfs(int v){

36     if(s[v]) return s[v];  //如果该点已经访问过了,就返回到该点的路径数

37     if(v==2)return 1; //找到终点,返回1条路

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

39         if(edge[v][i]<inf&&dist[i]<dist[v]){

40             s[v]+=dfs(i);

41         }

42     }

43     return s[v]; //返回到该点的所有路径数

44 }

45 

46 int main(){

47     while(scanf("%d",&n)!=EOF){

48         if(n==0)break;

49         scanf("%d",&m);

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

51             for(int j=1;j<=n;j++){

52                 if(i==j)edge[i][j]=0;

53                 else edge[i][j]=inf;

54             }

55         }

56         int a,b,dis;

57         for(int i=1;i<=m;i++){

58             scanf("%d%d%d",&a,&b,&dis);

59             if(edge[a][b]>=dis){

60                 edge[a][b]=edge[b][a]=dis;

61             }

62         }

63         Dijkstra(2);

64         memset(s,0,sizeof(s));

65         int count=dfs(1);

66         printf("%d\n",count);

67     }

68     return 0;

69 }

 

 

你可能感兴趣的:(HDU)