UVa 10917 - Walk Through the Forest(Dijkstra + DFS)

来源:互联网 发布:ubuntu界面太小 编辑:程序博客网 时间:2024/04/30 18:52

题意

小明要从办公室回家,当从A到家里存在一条路比B到家的任何一条路都短的话,就走A。问他有几种走法。

思路

意思就是A到终点的最短路比B的最短路短的时候可以走A。

先对终点进行一次Dijkstra,求出每个点到终点的距离,然后DFS。

代码

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define lowbit(x) ((x) & (-x))
  4. #define MP(a, b) make_pair(a, b)
  5. const int MAXN = 1000 + 5;
  6. const int INF = 0x3f3f3f3f;
  7. using namespace std;
  8. typedef pair<int, int> pii;
  9. typedef vector<int> vei;
  10. typedef vector<pair<int, int> >veii;
  11. typedef vector<int>::iterator viti;
  12. typedef vector<pii>::iterator vitii;
  13. typedef priority_queue<pii, vector<pii>, greater<pii> >pquii;
  14. pquii pqu;
  15. int dis[MAXN], dp[MAXN];
  16. veii mp[MAXN];
  17. void Dijkstra()
  18. {
  19. memset(dis, INF, sizeof dis);
  20. dis[2] = 0;
  21. pqu.push(MP(dis[2], 2));
  22. while (!pqu.empty())
  23. {
  24. pii u = pqu.top(); pqu.pop();
  25. int x = u.second;
  26. if (dis[x] != u.first) continue;
  27. for (vitii it = mp[x].begin(); it != mp[x].end(); it++)
  28. {
  29. int a = it->first, b = it->second;
  30. if (dis[a] > dis[x] + b)
  31. {
  32. dis[a] = dis[x] + b;
  33. pqu.push(MP(dis[a], a));
  34. }
  35. }
  36. }
  37. }
  38. int DFS(int x)
  39. {
  40. if (dp[x] != -1) return dp[x];
  41. if (x == 2) return 1;
  42. int sum = 0;
  43. for (vitii it = mp[x].begin(); it != mp[x].end(); it++)
  44. if (dis[it->first] < dis[x]) sum += DFS(it->first);
  45. return dp[x] = sum;
  46. }
  47. int main()
  48. {
  49. //freopen("input.txt", "r", stdin);
  50. int nroad, njit, i, j;
  51. while (scanf("%d", &njit), njit)
  52. {
  53. scanf("%d", &nroad);
  54. for (i = 0; i <= njit; i++) mp[i].clear();
  55. for (i = 0; i < nroad; i++)
  56. {
  57. int a, b, c;
  58. scanf("%d%d%d", &a, &b, &c);
  59. mp[a].push_back(MP(b, c)); mp[b].push_back(MP(a, c));
  60. }
  61. Dijkstra();
  62. memset(dp, -1, sizeof dp);
  63. printf("%d\n", DFS(1));
  64. }
  65. return 0;
  66. }
0 0