1 条题解

  • 1
    @ 2025-3-19 21:20:33

    看着一大堆,其实就是图的遍历

    (其实加了个排序)

    如果有很多篇文章可以参阅,请先看编号较小的那篇(因此你可能需要先排序)。

    完整代码

    #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
    上传者