1 条题解
-
1
看着一大堆,其实就是图的遍历
(其实加了个排序)
如果有很多篇文章可以参阅,请先看编号较小的那篇(因此你可能需要先排序)。
完整代码
#include<bits/stdc++.h> using namespace std; int n, m; vector<int >li[100005]; bool vis[100005]={false}; void dfs(int x, int visd){ vis[x]=true; cout<<x<<" "; if(visd==n)return;//如果全部访问完了,跳出 for(int i=0;i<li[x].size();i++){ if(!vis[li[x][i]]){ vis[li[x][i]]=true; dfs(li[x][i], visd+1); } } } queue<int>q; void bfs(int x){ memset(vis, false, sizeof(vis)); vis[x]=true; q.push(x); while(!q.empty()){ int v=q.front(); q.pop(); cout<<v<<" ";//记得加空格 for(int i=0;i<li[v].size();i++){ if(vis[li[v][i]]!=1){//一定记得判定是否访问过 q.push(li[v][i]); vis[li[v][i]]=true; } } } } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int x, y; cin>>x>>y; li[x].push_back(y);//构建图 } for(int i=1;i<=n;i++){ sort(li[i].begin(), li[i].end());//以题目所需排序 } dfs(1, 0); cout<<endl; bfs(1); return 0; }
1.建图
#include<bits/stdc++.h> using namespace std; int n, m; vector<int >li[100005];//STL,好用! bool vis[100005]={false};//是否访问过点 /* */ int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ int x, y; cin>>x>>y; li[x].push_back(y);//构建图 }
2.dfs
void dfs(int x, int visd){ vis[x]=true;//标记以免重复访问 cout<<x<<" "; if(visd==n)return;//如果全部访问完了,跳出 for(int i=0;i<li[x].size();i++){ if(!vis[li[x][i]]){ vis[li[x][i]]=true; dfs(li[x][i], visd+1); } } }
3.BFS
queue<int>q; void bfs(int x){ memset(vis, false, sizeof(vis)); vis[x]=true; q.push(x); while(!q.empty()){ int v=q.front(); q.pop(); cout<<v<<" ";//记得加空格 for(int i=0;i<li[v].size();i++){ if(vis[li[v][i]]!=1){//一定记得判定是否访问过 q.push(li[v][i]); vis[li[v][i]]=true; } } } }
4.排序,输出
for(int i=1;i<=n;i++){ sort(li[i].begin(), li[i].end());//题目所需从小到大排序 } dfs(1, 0); cout<<endl; bfs(1); return 0;
- 1
信息
- ID
- 9341
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 38
- 已通过
- 11
- 上传者