简单图算法

BFS广度优先搜索

#include<iostream>
#include<vector>
#include<queue>
using namespace std;

int main(){
    vector<int> v = {0,1,2,3,4,5};//定义结点
    vector<vector<int>> e = {{0,1},{1,3},{2,3},{3,4},{4,5}};//边的连接情况
    vector<vector<int>> graph;//定义图
    for(int i = 0;i< 6;i++){
        graph.push_back({});
    }
    for(auto i : e){
        graph[i[0]].push_back(i[1]);
        graph[i[1]].push_back(i[0]);
    }
    queue<int> myqueue;
    myqueue.push(0);
    vector<int> visit(6,0);
    while(!myqueue.empty()){
        int tmp = myqueue.front();
        myqueue.pop();
        visit[tmp] = 1;
        for(auto i : graph[tmp]){
            if(visit[i] != 1){
                myqueue.push(i);
            }

        }
        cout << tmp << " ";
    }
    return 0;
}

dfs深度优先搜索

#include<iostream>
#include<vector>
using namespace std;
vector<int> visit(5,0);
void dfs(vector<vector<int>> graph,int s){
    if(visit[s] == 1){
        return;
    } 
    cout << s << " ";
    visit[s] = 1;
    for(auto i : graph[s]){
        dfs(graph,i);
    }
}
int main(){
    vector<int> v = {0,1,2,3,4};//点
    vector<vector<int>> e = {{0,1},{2,2},{3,4}};//边
    vector<int> nul;
    vector<vector<int>> graph(5,nul);//邻接链表
    for(auto i : e){
        graph[i[0]].push_back(i[1]);
        graph[i[1]].push_back(i[0]);
    }
    int count = 0;
    for(auto i: v){
        if(visit[i] != 1){
            dfs(graph,i);
            count ++;
        }
        
    }
    cout << endl << count ;
    
    
}

dfs的拓扑排序

#include<iostream>
#include<vector>
using namespace std;
vector<int> visit(10,0);
void dfs(vector<vector<int>> graph,int i,vector<int> &indegree){//注意入度的数列要一直变化,加引用
    if(visit[i] == 1){
        return;
    }
    if(indegree[i] == 0){
        cout << i<< " ";
        visit[i] = 1;
        for(auto j : graph[i]){
            indegree[j]--;
            dfs(graph,j,indegree);
        }
    }
}
int main(){
    vector<int> v = {0,1,2,3,4,5,6,7,8,9};
    vector<vector<int>> e = {{0,1},{1,2},{0,3},{2,3},{3,5},{0,4},{5,6},{3,7},{6,7},{7,8},{0,9},{4,9}};
    vector<int> tmp;
    vector<vector<int>> graph(10,tmp);
    vector<int> indegree(10,0);
    for(auto i:e){
        graph[i[0]].push_back(i[1]);
        indegree[i[1]]++;
    }

    for(auto i : v){
        if(visit[i] == 0 && indegree[i] == 0){
            dfs(graph,i,indegree);
        }
        
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值