【深基18.例3】查找文献 - 洛谷
/*
* @Description: To iterate is human, to recurse divine.
* @Autor: Recursion
* @Date: 2022-03-11 09:23:08
* @LastEditTime: 2022-03-11 10:00:50
*/
#include<bits/stdc++.h>
using namespace std;
bool vis1[100001];//dfs
bool vis2[100001];//bfs
struct edge{
int u,v;//u起点v终点
};
vector<int> e[100001];
vector<edge> s;
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 x)
{
vis1[x]=1;
cout<<x<<" ";
for(int i=0;i<e[x].size();i++){
int point=s[e[x][i]].v;//找出当前这条边(也就是e[x][i])的终点
if(!vis1[point]){
dfs(point);
}
}
}
void bfs(int x){
queue<int> q;
q.push(x);
vis2[x]=1;
cout<<x<<" ";
while(!q.empty()){
int temp=q.front();
for(int i=0;i<e[temp].size();i++){
int point=s[e[temp][i]].v;
if(!vis2[point]){
q.push(point);
cout<<point<<" ";
vis2[point]=1;
}
}
q.pop();
}
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++){
int uu,vv;
cin>>uu>>vv;
s.push_back((edge){uu, vv});//奇妙的赋值方法
}
sort(s.begin(),s.end(),cmp);
for(int i=0;i<m;i++)
e[s[i].u].push_back(i);
//初始化e数组,在e[s[i].u](也就是i号边的起点s[i].u连接的边的数组)中存入i号边
dfs(1);
cout<<endl;
bfs(1);
}