https://www.luogu.com.cn/problem/P5318
洛谷:p5318查找文献
图的遍历dfs和bfs
s是边的集合
e是点和边的集合
如:
8 9 1 2 1 3 1 4 2 5 2 6 3 7 4 7 4 8 7 8
s[0]={1,2},s[1]={1,3},s[2]={1,4}……
e[1][0]=0 表示1号点的第一条边是0号边
e[1][1]=1,e[1][2]=2,e[2][0]=3,e[3][0]=4;
#include<iostream>
#include<algorithm>
#include<vector>
#include<memory.h>
#include<queue>
using namespace std;
struct edge{
int u,v;
};
vector<int> e[100005]; //第一位表示点 第二位表示对应的边
vector<edge> s; //边
bool vist[100005];
bool vist1[100005];
int n,m;
bool cmp(edge x,edge y){
if(x.v == y.v) return x.u<y.u;
else return x.v<y.v;
}
void dfs(int q){//深度优先搜素
//深搜用递归!!!
cout<<q<<' ';
vist[q]=1;
for(int i=0;i<e[q].size();i++){
int p = s[e[q][i]].v;
if(vist[p]==0)
dfs(p);
}
}
void bfs(){ //广度优先搜索
//广搜用队列!!!
queue<int> q;
q.push(1);
cout<<1<<' ';
vist1[1]=1;
while(!q.empty()){
int p=q.front();
for(int i=0;i<e[p].size();i++){
int x = s[e[p][i]].v;
if(vist1[x]==0){
q.push(x);
cout<<x<<' ';
vist1[x]=1;
}
}
q.pop();
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){ //插入
int x,y;
cin>>x>>y;
s.push_back((edge){x,y});//存边
}
sort(s.begin(),s.end(),cmp);
for(int i=0;i<m;i++)
e[s[i].u].push_back(i); //保存在图中
dfs(1);
cout<<endl;
bfs();
cout<<endl;
return 0;
}