对象:无权图,可不连通
一、DFS
1. 邻接矩阵
a.核心代码:
void dfs(int v) { cout<<v<<" "; visited[v]++;//标记已访问 for(int i=0;i<g.n;i++) if(!visited[i]&&g.edges[v][i])//节点是否访问 dfs(i); }
b.例题地址:http://120.77.243.165/problem.php?id=3956
#include<iostream> using namespace std; const int maxn=100; class Graph { struct matgraph { int n; int edges[maxn][maxn]; }; matgraph g; int visited[maxn]; public: void make_matgraph() { cin>>g.n; for(int i=0;i<g.n;i++) for(int j=0;j<g.n;j++) cin>>g.edges[i][j]; } void dfs(int v) { cout<<v<<" "; visited[v]++; for(int i=0;i<g.n;i++) if(!visited[i]&&g.edges[v][i])//节点是否访问 dfs(i); } friend int main();//友元 }; int main() { Graph a; a.make_matgraph(); for(int i=0;i<a.g.n;i++) a.visited[i]=0; for(int i=0;i<a.g.n;i++) if(!a.visited[i]) a.dfs(i); cout<<endl; return 0; }
2.邻接表式
a.核心代码:
b.例题地址:
二、BFS
1. 邻接矩阵
a.核心代码:
b.例题地址:
2.邻接表式
a.核心代码:
void bfs(int v=0) { int queue[maxn],front=0,rear=0; visit[v]=1; queue[rear++]=v; cout<<v<<" "; while(front!=rear) { int i=queue[front++]; for(int j=0;j<g.n;j++) { if(!visit[j]&&g.edges[i][j]) { cout<<j<<" "; visit[j]=1; queue[rear++]=j; } } } }
b.例题地址:
#include<iostream> using namespace std; const int maxn=100; class Mat_data//邻接矩阵 { int n; int edges[maxn][maxn]; friend class Matgraph; }; class Matgraph { Mat_data g;//邻接矩阵 int visit[maxn]; public: void make_matgraph(int n) { g.n=n; for(int i=0;i<g.n;i++) for(int j=0;j<g.n;j++) cin>>g.edges[i][j]; } void bfs(int v=0) { int queue[maxn],front=0,rear=0; visit[v]=1; queue[rear++]=v; cout<<v<<" "; while(front!=rear) { int i=queue[front++]; for(int j=0;j<g.n;j++) { if(!visit[j]&&g.edges[i][j]) { cout<<j<<" "; visit[j]=1; queue[rear++]=j; } } } } friend int main(); }; int main() { Matgraph g; int n; cin>>n; for(int i=0;i<n;i++) g.visit[i]=0; g.make_matgraph(n); for(int i=0;i<n;i++) if(!g.visit[i]) g.bfs(i); cout<<endl; return 0; }