一、图的表示法
1.邻接表
1.1采用STL中vector存图
vector<int>G[N];
G[v].push_back(u);//v点与u点联通
例如:
点 | 连接的点 |
---|---|
G[1] | 5 6 |
G[2] | 7 |
G[3] | 8 |
G[4] | |
G[5] | 9 |
G[6] | 5 9 |
G[7] | 1 |
G[8] | 4 |
G[9] | 1 |
1.2采用链表的连接方式存图
2.邻接矩阵
2.1采用二维数组存取邻接矩阵
m a p [ i ] [ j ] = { t r u e 若存在边edge(i,j) f a l s e 其他情况 map[i][j]= \begin{cases} true& \text{若存在边edge(i,j)}\\ false& \text{其他情况} \end{cases} map[i][j]={truefalse若存在边edge(i,j)其他情况
bool map[N][N];
map[i][j]=true;//i,j存在边
二、图的遍历
2.1深度优先搜索(DepthFirestSearch)
时间复杂度:显然邻接表为O(|V|+|E|),邻接矩阵为O(|V|^2)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
const int N = 100005;
struct E{
int u,v;
//E(int a,int b){u=a,v=b;}
};
vector<int>G[N];
vector<E>edge;
bool vis[N];
void dfs(int num){
vis[num]=true;
for(int i=0;i<G[num].size();i++){
if(!vis[G[num][i]]){
struct E temp;
temp.u=num;
temp.v=G[num][i];
edge.push_back(temp);
dfs(G[num][i]);
}
}
}
void depthFirstSearch(const int n){
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i);
}
}
for(int i=0;i<edge.size();i++){//输出边集
cout<<edge[i].u<<" "<<edge[i].v<<endl;
}
}
int main(){
int n=0,m=0; \\n个顶点,m条边
int u=0,v=0;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v;
G[u].push_back(v);
G[v].push_back(u);
}
depthFirstSearch(n);
return 0;
}
样例输入
9 9
1 5
1 6
1 7
2 7
3 8
4 8
5 6
5 9
6 9
样例输出
1 5
5 6
6 9
1 7
7 2
3 8
8 4
2.2广度优先搜索(BreadFirestSearch)
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
#include <queue>
using namespace std;
const int N = 100005;
struct E{
int u,v;
//E(int a,int b){u=a,v=b;}
};
vector<int>G[N];
vector<E>edge;
bool vis[N];
queue<int>enqueue;
void breadFirstSearch(const int n){
for(int i=1;i<=n;i++){
if(!vis[i]){
enqueue.push(i);
vis[i]=true;
while(!enqueue.empty()){
int num=enqueue.front();
enqueue.pop();
for(int j=0;j<G[num].size();j++){
if(!vis[G[num][j]]){
vis[G[num][j]]=true;
struct E temp;
enqueue.push(G[num][j]);
temp.u=num;
temp.v=G[num][j];
edge.push_back(temp);
}
}
}
}
}
//输出查找边集
for(int i=0;i<edge.size();i++){
cout<<edge[i].u<<" "<<edge[i].v<<endl;
}
return;
}
int main(){
int n=0,m=0;
int u=0,v=0;
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>u>>v;
G[u].push_back(v); //无向图
G[v].push_back(u);
}
breadFirstSearch(n);
return 0;
}
样例输入
9 10
1 5
1 6
1 7
1 9
2 7
3 8
4 8
5 6
5 9
6 9
样例输出
1 5
1 6
1 7
1 9
7 2
3 8
8 4