• (笔记整理未完成)【图论】图的遍历


    知识点



    模板题:洛谷 P5318 【深基18.例3】查找文献

    小K 喜欢翻看洛谷博客获取知识。每篇文章可能会有若干个(也有可能没有)参考文献的链接指向别的博客文章。小K 求知欲旺盛,如果他看了某篇文章,那么他一定会去看这篇文章的参考文献(如果他之前已经看过这篇参考文献的话就不用再看它了)。

    假设洛谷博客里面一共有 n(n\le10^5) 篇文章(编号为 1 到 n)以及 m(m\le10^6) 条参考文献引用关系。目前小 K 已经打开了编号为 1 的一篇文章,请帮助小 K 设计一种方法,使小 K 可以不重复、不遗漏的看完所有他能看到的文章。

    这边是已经整理好的参考文献关系图,其中,文献 X → Y 表示文章 X 有参考文献 Y。不保证编号为 1 的文章没有被其他文章引用。

    请对这个图分别进行 DFS 和 BFS,并输出遍历结果。如果有很多篇文章可以参阅,请先看编号较小的那篇(因此你可能需要先排序)。

    输入格式

    共 m+1 行,第 1 行为 2 个数,n 和 m,分别表示一共有 n(n\le10^5)  篇文章(编号为 1 到 n)以及m(m\le10^6)条参考文献引用关系。

    接下来 m 行,每行有两个整数 X,Y表示文章 X 有参考文献 Y。

    输出格式

    共 2 行。 第一行为 DFS 遍历结果,第二行为 BFS 遍历结果。

    输入输出样例

    输入 #1

    8 9
    1 2
    1 3
    1 4
    2 5
    2 6
    3 7
    4 7
    4 8
    7 8

    输出 #1

    1 2 5 6 3 7 8 4 
    1 2 3 4 5 6 7 8 
    

     已AC代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. #include
    7. using namespace std;
    8. const int maxn=1e7+5;
    9. int n,m,a,b;
    10. bool visit[maxn];
    11. int head[maxn],Next[maxn],tot,temp[maxn];
    12. struct Edge
    13. {
    14. int from,to;
    15. }edge[maxn];
    16. inline int read()
    17. {
    18. int x=0,f=1;
    19. char c=getchar();
    20. while(c<'0'||c>'9')
    21. {
    22. if(c=='-') f=-1;
    23. c=getchar();
    24. }
    25. while(c>='0'&&c<='9')
    26. {
    27. x=(x<<3)+(x<<1)+(c^48);
    28. c=getchar();
    29. }
    30. return x*f;
    31. }
    32. bool cmp(Edge x,Edge y)
    33. {
    34. if(x.from==y.from) return x.to > y.to;
    35. else return x.from
    36. }
    37. inline void add(int u,int v) //建图
    38. {
    39. edge[++tot].to=v;
    40. Next[tot]=head[u];
    41. head[u]=tot;
    42. }
    43. inline void dfs(int x)
    44. {
    45. printf("%d ",x);
    46. visit[x]=true;
    47. for(int j=head[x];j;j=Next[j])
    48. {
    49. if(!visit[edge[j].to])
    50. dfs(edge[j].to);
    51. }
    52. }
    53. void bfs(int x)
    54. {
    55. memset(visit,false,sizeof(visit)); //不要忘记数组清零!!!
    56. queue <int> q;
    57. q.push(1);
    58. visit[1]=true;
    59. while(!q.empty())
    60. {
    61. int z=q.front();
    62. printf("%d ",z);
    63. q.pop();
    64. for(int j=head[z];j;j=Next[j])
    65. {
    66. int y=edge[j].to;
    67. if(visit[y]==false)
    68. {
    69. q.push(edge[j].to);
    70. visit[edge[j].to]=true;
    71. }
    72. }
    73. }
    74. }
    75. int main()
    76. {
    77. n=read();m=read();
    78. for(int i=1;i<=m;++i)
    79. {
    80. edge[i].from=read();
    81. edge[i].to=read();
    82. }
    83. sort(edge+1,edge+m+1,cmp);
    84. for(int i=1;i<=m;++i)
    85. {
    86. add(edge[i].from,edge[i].to);
    87. }
    88. dfs(1);
    89. cout<
    90. bfs(1);
    91. return 0;
    92. }

    2. 洛谷 P2853 [USACO06DEC]Cow Picnic S

    思路:这道题考察图的遍历。需要注意查找完一个点后会进行下一次遍历查找,用于做标记的数组要清空。

    1. #include
    2. #include
    3. #include
    4. #include
    5. #include
    6. using namespace std;
    7. int k,n,m;
    8. const int maxn=1e7+5;
    9. struct node{
    10. int to,next;
    11. }edge[maxn<<1];
    12. int start[maxn],num=0,head[maxn],ans=0,check[maxn];
    13. bool vis[maxn];
    14. inline int read()
    15. {
    16. int x=0,f=1;
    17. char c=getchar();
    18. while(c<'0'||c>'9')
    19. {
    20. if(c=='-') f=-1;
    21. c=getchar();
    22. }
    23. while(c>='0'&& c<='9')
    24. {
    25. x=(x<<3)+(x<<1)+(c^48);
    26. c=getchar();
    27. }
    28. return x*f;
    29. }
    30. inline void write(int x)
    31. {
    32. if(x<0) putchar('-'),x=-x;
    33. if(x>9) write(x/10);
    34. putchar(x%10+'0');
    35. }
    36. inline void add(int u,int v)
    37. {
    38. edge[++num].to=v;
    39. edge[num].next=head[u];
    40. head[u]=num;
    41. }
    42. inline void dfs(int u)
    43. {
    44. check[u]++; //统计能经过该点的有多少只牛
    45. for(int i=head[u];i!=-1;i=edge[i].next)
    46. {
    47. int v=edge[i].to;
    48. if(!vis[v]) //如果下一个点没查找过
    49. {
    50. vis[v]=1;
    51. dfs(v);
    52. }
    53. }
    54. }
    55. int main()
    56. {
    57. k=read(); n=read(); m=read();
    58. memset(head,-1,sizeof(head));
    59. for(int i=1;i<=k;++i)
    60. {
    61. start[i]=read();
    62. }
    63. for(int i=1;i<=m;++i)
    64. {
    65. int u=read(),v=read();
    66. add(u,v);
    67. }
    68. for(int i=1;i<=k;++i)
    69. {
    70. vis[start[i]]=1; //起始牧场有牛
    71. dfs(start[i]);
    72. memset(vis,0,sizeof(vis)); //查找完s[i]点后要清空
    73. }
    74. for(int i=1;i<=n;++i)
    75. {
    76. if(check[i]==k)
    77. ans++;
    78. }
    79. write(ans);
    80. return 0;
    81. }

     

  • 相关阅读:
    shiro基础(一)shiroFilter
    YAPI接口自动鉴权功能部署详解
    MySQL之账号管理、建库以及四大引擎
    小白必备:简单几步, 使用Cpolar+Emlog在Ubuntu上搭建个人博客网站
    k8s之Pod控制器详解
    如何使用Ruby 多线程爬取数据
    大数据可视化模块竞赛Vue项目文件结构与注意事项
    壳聚糖-聚乙二醇-罗丹明B,RhodamineB-PEG-Chitosan
    安全管理:守护数据库的堡垒(九)
    腾讯云服务器如何手动安装node.js环境?
  • 原文地址:https://blog.csdn.net/gzkeylucky/article/details/126095641