1. 图的2种常用方式
a .邻接矩阵
b .数组模拟邻接表(普通数组和动态数组)
2. 图的两种遍历方法
a .深度优先搜索(dfs)
b .广度优先搜索(bfs)
技巧:关键是如何处理父子关系。对于DFS算法来说父亲出栈,其合法孩子入栈,对于对于BFS算法来说父亲出队,其合法孩子入队。
重要工作:判断孩子的合法性(不重复,满足约束条件)
3. 代码
a. DFS
#include<bits/stdc++.h>
using namespace std;
#define N 1000
int n;
int m;
struct edge
{
int v,w;
};
vector<edge> G[N];
void insert(int u,int v,int w)
{
G[u].push_back({v,w});
}
int vis[N];
void dfs(int u)
{
cout<<u<<endl;
vis[u]=1;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i].v; //v为u的的i个孩子
if(vis[v]==0)
{
dfs(v);//v没找过就找他及他的子孙后代
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
insert(x,y,z);
insert(y,x,z);
}
dfs(0);
return 0;
}
/*
5
7
0 1 1
0 3 1
0 4 1
1 2 1
1 4 1
2 3 1
3 4 1
*/
b. BFS
#include<bits/stdc++.h>
using namespace std;
#define N 1000
int n;
int m;
struct edge
{
int v,w;
};
vector<edge> G[N];
void insert(int u,int v,int w)
{
G[u].push_back({v,w});
}
int vis[N];
void bfs(int start)
{
queue<int> q; //定义队列
q.push(start); //老祖宗,起点入队
vis[start]=1; //标记起点
while(q.empty()==false)
{
int u=q.front(); //取父亲
q.pop();//父亲出队
cout<<u<<endl;
for(int i=0;i<G[u].size();i++)
{
int v=G[u][i].v; //v为u的的i个孩子
if(vis[v]==0)
{
vis[v]=1;
q.push(v);//v没找过就找他及他的子孙后代
}
}
}
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
insert(x,y,z);
insert(y,x,z);
}
bfs(0);
return 0;
}
/*
5
7
0 1 1
0 3 1
0 4 1
1 2 1
1 4 1
2 3 1
3 4 1
*/