P5318 【深基18.例3】查找文献
图论中基本的深度与广度遍历,注意在遍历中如何保证先遍历编号小的结点。
#include<iostream> #include<cstdio> #include<vector> #include<algorithm> #include<queue> #include<cstring> using namespace std; vector<int> a[100100]; queue<int> dl; bool b[100100]; int v,n; void dfs(int i) { if(b[i]!=0||i<1||i>v) return; b[i]=1; cout<<i<<" "; for(int j=0;j<a[i].size();j++) { dfs(a[i][j]); } } void bfs(int i) { dl.push(i); b[i]=1; while(!dl.empty()) { int x; x=dl.front(); cout<<x<<" "; for(int j=0;j<a[x].size();j++) { if(b[a[x][j]]==0) { dl.push(a[x][j]); b[a[x][j]]=1; } } dl.pop(); } } int main() { cin>>v>>n; for(int i=1;i<=n;i++) { int x,y; cin>>x>>y; a[x].push_back(y); } for(int i=1;i<=v;i++) { sort(a[i].begin(),a[i].end());//保证编号小的结点优先被遍历到 } dfs(1); memset(b,0,sizeof(b)); cout<<endl; bfs(1); }