刷题心得-图

图的存储

邻接表

无结构体

vector<int> vs[n]; //边
int vw[n]; //点权,下标对应顶点编号
int gw[n][n]; //边权

结构体

struct node{
    int v;//到达顶点
    int w;//边权
}
vector<node> vs[n]; //边,边权
int vw[n]; //点权,下标对应顶点编号

邻接矩阵

int g[n][n]; //边
int vw[n]; //点权,下标对应顶点编号
int gw[n][n]; //边权

图的遍历

DFS

邻接表

#include <iostream>
#include <vector>
using namespace std;
const int maxn=10;
vector<int> g[maxn];
int n,vis[maxn];
void dfs(int v, int h) {
    vis[v]=1;
    // 层级相关处理,或者对当前访问顶点的处理
    for(int i=0; i<g[v].size(); i++) {
        if(vis[g[v][i]]==0) {
            dfs(g[v][i],h+1);
        }
    }
}
void dfs_travel() {
    for(int i=0; i<n; i++) {
        if(vis[i]==0) {
            dfs(i,1); //起始高度假设为1
            // 统计连通分量
        }
    }
}
int main(int argc,char * argv[]) {
    scanf("%d",&n);
    int a,b;
    for(int i=0;i<n;i++){
        scanf("%d %d",&a,&b);
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfs_travel();
    return 0;
}

邻接矩阵

#include <iostream>
#include <vector>
using namespace std;
const int maxn=10;
int g[maxn][maxn];
int n,vis[maxn];
void dfs(int v, int h) {
    vis[v]=1;
    // 层级相关处理,或者对当前访问顶点的处理
    for(int i=1; i<=n; i++) {
        if(g[v][i]==1 && vis[i]==0) {
            dfs(i, h+1);
        }
    }
}
void dfs_travel() {
    for(int i=1; i<=n; i++) {
        if(vis[i]==0) {
            dfs(i,1); //起始高度假设为1
            // 统计连通分量
        }
    }
}
int main(int argc,char * argv[]) {
    scanf("%d",&n);
    int a,b;
    for(int i=1; i<=n; i++) { //顶点编号从1开始 
        scanf("%d %d",&a,&b);
        g[a][b]=1;
        g[b][a]=1;
    }
    dfs_travel();
    return 0;
}

BFS

邻接表版(无层级)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn=10;
vector<int> g[maxn];
int n,vis[maxn];
void bfs(int v) {
    queue<int> q;
    q.push(v);
    vis[v]=1;
    while(!q.empty()){
        int w = q.front();
        q.pop();
                // 层级相关处理,或者对当前访问顶点的处理
        for(int i=0;i<g[w].size();i++){
            if(vis[g[w][i]]==0){
                q.push(g[w][i]);
                vis[g[w][i]]=1; 
            }
        }
    }
}
void bfs_travel() {
    for(int i=0; i<n; i++) {
        if(vis[i]==0) {
            bfs(i); //起始高度假设为1
            // 统计连通分量
        }
    }
}
int main(int argc,char * argv[]) {
    scanf("%d",&n);
    int a,b;
    for(int i=0;i<n;i++){
        scanf("%d %d",&a,&b);
        g[a].push_back(b);
        g[b].push_back(a);
    }
    bfs_travel();
    return 0;
}

邻接表(含层级)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn=10;
vector<int> g[maxn];
int n,vis[maxn];
struct node{
    int v;
    int h; 
};
void bfs(int v) {
    queue<node> q;
    q.push({v,1}); //初始层级为1 
    vis[v]=1;
    while(!q.empty()){
        node w = q.front();
        q.pop();
                // 层级相关处理,或者对当前访问顶点的处理
        for(int i=0;i<g[w.v].size();i++){
            if(vis[g[w.v][i]]==0){
                q.push({g[w.v][i],w.h+1});
                vis[g[w.v][i]]=1; 
            }
        }
    }
}
void bfs_travel() {
    for(int i=0; i<n; i++) {
        if(vis[i]==0) {
            bfs(i); //起始高度假设为1
            // 统计连通分量
        }
    }
}
int main(int argc,char * argv[]) {
    scanf("%d",&n);
    int a,b;
    for(int i=0;i<n;i++){
        scanf("%d %d",&a,&b);
        g[a].push_back(b);
        g[b].push_back(a);
    }
    bfs_travel();
    return 0;
}

邻接矩阵版(无层级)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn=10;
int g[maxn][maxn];
int n,vis[maxn];
void bfs(int v) {
    queue<int> q;
    q.push(v);
    vis[v]=1;
    while(!q.empty()) {
        int w = q.front();
        q.pop();
                // 层级相关处理,或者对当前访问顶点的处理
        for(int i=1; i<=n; i++) {
            if(g[w][i]==1 && vis[i]==0) {
                q.push(i);
                vis[i]=1;
            }
        }
    }
}
void bfs_travel() {
    for(int i=1; i<=n; i++) {
        if(vis[i]==0) {
            bfs(i); //起始高度假设为1
            // 统计连通分量
        }
    }
}
int main(int argc,char * argv[]) {
    scanf("%d",&n);
    int a,b;
    for(int i=1; i<=n; i++) { //顶点编号从1开始
        scanf("%d %d",&a,&b);
        g[a][b]=1;
        g[b][a]=1;
    }
    bfs_travel();
    return 0;
}

邻接矩阵(含层级)

#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int maxn=10;
int g[maxn][maxn];
int n,inq[maxn];
struct node {
    int v;
    int h;
};
void bfs(int v) {
    queue<node> q;
    q.push({v,1}); //初始层级为1
    inq[v]=1;
    while(!q.empty()) {
        node w = q.front();
        q.pop();
        // 层级相关处理,或者对当前访问顶点的处理
        for(int i=1; i<=n; i++) {
            if(g[w.v][i]==1 && inq[i]==0) {
                q.push({i,w.h+1});
                inq[i]=1;
            }
        }
    }
}
void bfs_travel() {
    for(int i=1; i<=n; i++) {
        if(inq[i]==0) {
            bfs(i); //起始高度假设为1
            // 统计连通分量
        }
    }
}
int main(int argc,char * argv[]) {
    scanf("%d",&n);
    int a,b;
    for(int i=1; i<=n; i++) {
        scanf("%d %d",&a,&b);
        g[a][b]=1;
        g[b][a]=1;
    }
    bfs_travel();
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/houzm/p/12359397.html