图的遍历
方法一:宽搜
queue<int> q;
void bfs(int s){
q.push(s);
mark[s]=1;
while(q.size()){
int x=q.front();
q.pop();
cout<<x<<endl;
for(int i=Last[x];i;i=Next[i]){
int y=End[i];
if(!mark[y]){
q.push(y);
mark[y]=1;
}
}
}
}
方法二:前序遍历
void dfs(int x){
cout<<x<<endl;
mark[x]=1;
for(int i=Last[x];i;i=Next[i]){
int y=End[i];
if(!mark[y])
dfs(y);
}
}
方法三:后序遍历
void dfs(int x){
mark[x]=1;
for(int i=Last[x];i;i=Next[i]){
int y=End[i];
if(!mark[y])
dfs(y);
}
cout<<x<<endl;
}
PS:为了节约篇幅,以下代码全部是暴力存图,请换成更优化的存图方式!!!
连通图
在无向图中,任意两点都直接联通或间接联通。
子图
表示在一个图中删去若干条边或删去若干点得到的新的图就是它本身的子图(说白了就是一个图的一部分)
PS:一个图的子图包括它本身
如果一个图的子图是连通图,则称这个子图为联通子图
连通分量
无向图G的最大联通子图成为G的连通分量。
最大连通子图的含义:
该子图是G的连通子图,将G的任何不在该子图中的了点加入到该子图后,该子图将不再连通。
有向图的连通性
在有向图中,对于每一对定点Vi,Vj都存在从Vi到Vj和从Vj到Vi的路径(任意两点之间都存在可到达对方的路径),则称改图为强连通图。
如果有向图G的子图是连通图,则称这个子图为强连通子图
有向图G的最大强连通分量称为G的强连通分量。
最大强连通分量的含义:
该子图是G的强连通子图