[关闭]
@PaulGuan 2016-10-09T02:38:02.000000Z 字数 715 阅读 664

L - Subway 题解

算法 题解


题目大意

一个无向图,有n n (3 ≤ n ≤ 3000) 个点,有且只有一个环,求各个点(包括环上的点)到环的最短距离。

分析

由于只有一个环,我们可以用DFS(深度优先搜索)进行环的判定。而且,任何点在DFS中遇到的第一个环上的点就是环上离这个点最近的点。而我们在DFS中需要一个vis数组进行标记,我们可以让vis数组还记录下走过的步数,即下代码中的step数组。注意步数不能从0开始计数,否则无法区分该点是否被vis。
下图便是这个图的一个例子:

无标题.png-7.9kB

代码

  1. #include <iostream>
  2. #include <vector>
  3. #include <cstring>
  4. using namespace std;
  5. vector <int> pic[3005];
  6. int n;
  7. int step[3005];
  8. int solve(int v,int fa,int s)
  9. {
  10. step[v]=s;
  11. int i;
  12. for(i=0;i<pic[v].size();i++)
  13. {
  14. int u=pic[v][i];
  15. if(u==fa)
  16. continue;
  17. if(step[u])
  18. return step[u];
  19. int ans=solve(u,v,s+1);
  20. if(ans)
  21. return ans;
  22. }
  23. return 0;
  24. }
  25. int main(void)
  26. {
  27. cin>>n;
  28. int i;
  29. for(i=0;i<n;i++)
  30. {
  31. int u,v;
  32. cin>>u>>v;
  33. pic[u].push_back(v);
  34. pic[v].push_back(u);
  35. }
  36. for(i=1;i<=n;i++)
  37. {
  38. memset(step,0,sizeof(step));
  39. if(i!=1)
  40. cout<<" ";
  41. cout<<solve(i,-1,1)-1;
  42. }
  43. return 0;
  44. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注