HDU ACM 1142 A Walk Through the Forest (最短路径Dijkstra + 深搜DFS)

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

题意:点1为起点 点2为终点 从点1走到点x点后,要求点x到点2的距离小于点1到点2的距离 统计路径数目.

  输入:n为点的数目 m为道路数目

     a b c 为  a到b的权值为c

  输出:路径数目

 

思路:用dijkstra +DFS()

  dijkstra:找出所有点到点2的最短路径,但是遍历所有点到2在记录会超时,所以用2为起点求到各点的最短路径.

  DFS():需要剪枝,否则也会超时 用mark()数组记录之前进行过DFS得点数.

 

View Code
 1 #include <iostream>
 2 using namespace std;
 3 const int MAX = 1000 + 10;
 4 const int INF = 0x3fffffff;
 5 int map[MAX][MAX];
 6 int used[MAX];
 7 int dis[MAX];
 8 
 9 int n;
10 int Dijkstra(int start)
11 {
12     memset(used,0,sizeof(used));
13     int i;
14     for(i=1;i<=n;i++)
15     {
16         dis[i]= INF;
17     }
18     dis[start] = 0;
19     for(int j=1;j<=n;j++)
20     {
21         int min=INF;
22         int mid=0;
23         for(i=1;i<=n;i++)
24         {
25             if( !used[i] && dis[i]<min )
26             {
27                 min=dis[i];
28                 mid=i;
29             }
30         }
31         used[mid]=1;
32         for(i=1;i<=n;i++)
33         {
34             if( !used[i] && dis[i]>dis[mid]+map[mid][i] && map[mid][i])
35             {
36                 dis[i]=dis[mid]+map[mid][i];
37             }
38         }
39     }
40     return 1;
41 }
42 int sum;
43 int visit[MAX];
44 int mark[MAX];
45 int DFS(int x)
46 {
47     int i;
48     if(mark[x])
49     {
50         return mark[x];
51     }
52     if(x == 2)
53     {
54         return 1;
55     }
56     for(i=1;i<=n;i++)
57     {
58         if(visit[i] == 0 && map[x][i] && dis[i] < dis[x])
59         {
60             mark[x] +=DFS(i);
61         }
62     }
63     return mark[x];
64 }
65 int main()
66 {
67     int m;
68     while(cin>>n,n)
69     {
70         memset(map,0,sizeof(map));
71         memset(visit,0,sizeof(visit));
72         memset(mark,0,sizeof(mark));
73         cin>>m;
74         int i;
75         for(i=1;i<=m;i++)
76         {
77             int a,b,c;
78             cin>>a>>b>>c;
79             map[a][b] = map[b][a] = c;
80         }
81          Dijkstra(2);
82         cout<<DFS(1)<<endl;
83     }
84     return 0;
85 }

 

posted @ 2012-08-27 16:03  zx雄  阅读(261)  评论(0编辑  收藏  举报