P5318 【深基18.例3】查找文献

简介: P5318 【深基18.例3】查找文献

题目描述


20210510215329456.png

20210510215351755.png

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

输入

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

输出

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

思路:DFS+BFS+图的存储 这个题中在搜索过程中需要不断的判断两点之间的边是否存在,所以应该使用邻接矩阵,但由于数据量太多,所以邻接矩阵也是不行的.我们可以使用vector.然后用一种新的方法来存储图.


首先,我们用一个结构体vector(为了节省空间,咱用vector来存)存储每个边的起点和终点,然后用一个二维vector(也就是一个vector数组)存储边的信息。

我们用e[a][b]=c,来表示顶点a的第b条边是c号边。咱举个栗子,还是拿样例说吧:

8 9
1 2 //0号边(由于vector的下标是从0开始的,咱就“入乡随俗”,从0开始)
1 3 //1号边
1 4 //2号边
2 5 //3号边
2 6 //4号边
3 7 //5号边
4 7 //6号边
4 8 //7号边
7 8 //8号边

最后二维vector中的存储会如下所示:

0 1 2 //1号顶点连着0、1、2号边
3 4 //2号顶点连着3、4号边
5 //3号顶点连着5号边
6 7 //4号顶点连着6、7号边
  //5号顶点没有边
  //6号顶点没有边
8 //7号顶点连着8号边
  //8号顶点没有边


  1. 别忘了题目要求:“如果有很多篇文章可以参阅,请先看编号较小的那篇”
    那就排序呗!咱们按照题目要求,如果起始点相同则先终点从小到大进行排列,如果起始点不同则起始点从小到大排列.(这里的理解可能有问题,看出来的兄弟,可以说说自己的想法)

参考代码


#include<bits/stdc++.h>
using namespace std;
const int maxn = 100000+10;
int n,m,vex[maxn],visited1[maxn],visited2[maxn],u2,v2;
struct edge{
  int u,v;
  edge(int u1,int v1):u(u1),v(v1){//构造方法 
  };
};
vector<edge> s;
vector<int> e[maxn];
bool cmp(edge X,edge Y){//用于排序 
//  if(X.v==Y.v){
//    return X.u<Y.u;
//  }else{
//    return X.v < Y.v;
//  }
  if(X.u==Y.u){
    return X.v < Y.v;
  }else{
    return X.u < Y.u;
  }
}
void dfs(int x){
  cout<<x<<" ";
  visited1[x] = 1;
  for(int i = 0; i < e[x].size(); i++){// i:代表e下表 
    int w = e[x][i];
    if(!visited1[w])//没有被访问 
    {
      dfs(w);
    }
  }
}
void bfs(int x){
  queue<int> Q;
  Q.push(x);
  visited2[x] = 1;
  while(!Q.empty()){
    int temp = Q.front();
    Q.pop();
    cout<<temp<<" ";
    for(int i = 0; i < e[temp].size(); i++){
      int w = e[temp][i];
      if(!visited2[w]){
        Q.push(w);
        visited2[w] = 1;
      }
    }
  }
}
int main()
{
  cin>>n>>m;
  while(m--){
    cin>>u2>>v2;
    s.push_back(edge(u2,v2));//将边放到s中 
  }
  sort(s.begin(),s.end(),cmp);//进行排序   按照终点从小到大进行排序,如果终点相同则按照起始点从 小到大进行排序 (后面) 
//  for(int i = 0; i < s.size(); i++){
//    cout<<s[i].u<<"--"<<s[i].v<<endl;
//  }
  for(int i = 0;i<s.size(); i++) //vector  用s对邻接表进行初始化(这是一个由vector构成的邻接表) 
  {
    e[s[i].u].push_back(s[i].v);
  }
  dfs(1);
  cout<<endl;
  bfs(1);
  cout<<endl; 
  return 0;
}
相关文章
|
算法
Tarjan 求有向图的强连通分量
Tarjan算法是一种用于查找有向图中强连通分量的高效方法。作者分享了自己的笔记,强调了网上解释的不清晰性,并引用了OI Wiki的资源。算法维护每个节点的`dfn`(深度优先搜索顺序)和`low`(能到达的最小DFS序)。通过遍历节点和其邻接节点,更新`low`值,识别环路。当`dfn[x] == low[x]`,表示找到一个强连通分量。代码示例展示了具体的实现细节。
300 0
|
安全 算法 Go
有向图的强联通分量(SCC)Tarjan算法
有向图的强联通分量(SCC)Tarjan算法
811 0
文献检索
一.学术搜索 谷歌 百度 360 独秀 必应
751 0
|
16天前
|
人工智能 自然语言处理 文字识别
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
Qwen3.7-Max是阿里云百炼面向智能体时代推出的新一代旗舰模型,对标GPT-5.5、Claude Opus 4.7等闭源旗舰。该模型支持百万级token上下文窗口,具备顶级推理能力、多模态搜索与视觉理解增强、流式输出低延迟响应等核心优势,覆盖编程、办公、长周期自主执行等复杂场景。同时支持OpenAI接口兼容,便于系统快速迁移。用户可通过Token Plan团队或节省计划等订阅方式灵活调用,适合企业级高要求场景使用。
5879 30
阿里云百炼Qwen3.7-Max简介:能力、优势、支持订阅计划参考
|
1天前
|
数据采集 人工智能 前端开发
让 Coding Agent 从黑盒到透明:阿里云 Agent 观测审计数据采集实践
AI Agent 规模化落地带来执行黑盒、行为难追溯、成本难度量三大难题。阿里云基于 OTel 标准,面向 Coding Agent、个人通用助理和框架型 Agent,推出 LoongSuite Pilot、插件及探针等无侵入采集方案,让 Agent 实现可看见、可分析、可审计、可治理。
561 134
|
10天前
|
存储 定位技术 数据库
CodeGraph 如何让 Claude Code减少 7 成工具调用?
CodeGraph 为 Coding Agent 提供本地代码知识图谱,把函数、类、调用链和框架路由提前整理成“项目地图”,减少盲目搜索和文件读取。它不是新 Agent,而是上下文基础设施,让 Agent 更快找到正确代码路径,平均减少 7 成工具调用。
1178 2
|
8天前
|
人工智能 安全 定位技术
CodeGraph深度解析 让Claude Code工具调用直降七成的核心原理与实操教程
如今以Claude Code为代表的AI编程智能体已经成为开发者日常编码、项目重构、漏洞修复的必备工具。但在长期使用过程中,几乎所有开发者都会遇到同一个明显痛点:AI虽然具备强大的代码生成与分析能力,却常常陷入盲目探索的循环中。
962 1