hdu1142(最短路+DFS)

来源:互联网 发布:湖南才能网络 编辑:程序博客网 时间:2024/05/21 22:54


题目大意:寻找一共有多少条符合题意的路。能够从点A走到点B的要求是:点A到终点的最短路 > 点B到终点的最短路。 也就是说:从终点出发,求每一个点的最短路,然后那些最短路的值记录起来,作为能否通过的判断条件。最后用记忆化搜索来搜索出一共多少条符合要求的路。普通的dfs是超时的,bfs是超内存的。


  1. #include <stdio.h>  
  2. #include <string.h>  
  3. #include <algorithm>  
  4. using namespace std;  
  5.   
  6. const int inf = 999999999;  
  7. int map[1005][1005];  
  8. int dis[1005],vis[1005];  
  9. int path[1005];  
  10. int n,m;  
  11.   
  12. void Dijkstra(int src)  
  13. {  
  14.     int i,j,minn,pos;  
  15.     memset(vis,0,sizeof(vis));  
  16.     for(i = 0; i<=n; i++)  
  17.         dis[i] = map[src][i];  
  18.     dis[src] = 0;  
  19.     vis[src] = 1;  
  20.     for(i = 1; i<=n; i++)  
  21.     {  
  22.         minn = inf;  
  23.         pos = 0;  
  24.         for(j = 1; j<=n; j++)  
  25.         {  
  26.             if(minn>dis[j] && !vis[j])  
  27.                 minn = dis[pos = j];  
  28.         }  
  29.         vis[pos] = 1;  
  30.         for(j = 1; j<=n; j++)  
  31.             if(dis[j]>dis[pos]+map[pos][j] && !vis[j])  
  32.                 dis[j] = dis[pos]+map[pos][j];  
  33.     }  
  34. }  
  35.   
  36. int DFS(int src)  
  37. {  
  38.     if(path[src] !=-1)  
  39.         return path[src];  
  40.     if(src == 2)  
  41.         return 1;  
  42.     path[src] = 0;  
  43.     for(int i = 1; i<=n; i++)  
  44.     {  
  45.         if(dis[i]<dis[src] && map[i][src]!=inf)  
  46.             path[src]+=DFS(i);  
  47.     }  
  48.     return path[src];  
  49. }  
  50.   
  51. int main()  
  52. {  
  53.     int i,j,x,y,z;  
  54.     while(~scanf("%d",&n),n)  
  55.     {  
  56.         scanf("%d",&m);  
  57.         for(i = 0; i<=n; i++)  
  58.         {  
  59.             for(j = 0; j<=n; j++)  
  60.                 map[i][j] = inf;  
  61.             map[i][i] = 0;  
  62.         }  
  63.         for(i = 0; i<m; i++)  
  64.         {  
  65.             scanf("%d%d%d",&x,&y,&z);  
  66.             map[x][y] = map[y][x] = z;  
  67.         }  
  68.         Dijkstra(2);  
  69.         memset(path,-1,sizeof(path));  
  70.         printf("%d\n",DFS(1));  
  71.     }  
  72.   
  73.     return 0;  
  74. }  


/*******************************


今天早点回去,想吹吹笛子了,最近喜欢看游记,买了瓦尔登湖的中英文版,希望可以坚持看完

原创粉丝点击