第六章学习小结

第六的学习,是对图的学习

比起树而言,图的学习更加灵活也更加复杂。

和树一样有着许多的术语,不过因为跟树有着不少联系,学习起来倒是不太吃力。

而图的存储结构和树一样也是较为多样:邻接矩阵,邻接表,十字链表,邻接多重表,虽然理解起来有点困难但有些也有点新瓶装旧酒可以联系以前学习的内容助于理解。

然而,与先前的内容相结合,如链表,队列,树,使得学习起来对思维的要求更高,就像老师说的,不仅要有编程的能力,也要有大学四年后还能应用的思维。

 

本章的学习除了存储结构外,遍历中的深搜,广搜,和几个重要的应用更为难啃。在课堂和课外也花了不少功夫琢磨。

 

PTA题目:列出连通集

 

 

给定一个有1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。

 

输入格式:

 

输入第1行给出2个整数N(0<N10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。

 

输出格式:

 

按照 “ { v1, v2, v3, ... ,vk } ”的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

 

1​​ v2​​ ... vk​​ }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。

 

输入样例:

 

8 6
0 7
0 1
2 0
4 1
2 4
3 5

 

输出样例:

 

{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }

从题目不难看出,主要做的两个方向:构造图,应用DFS,BFS算法。
#include <iostream>
#include <queue>
#include <cstdio>
using namespace std;
 
typedef struct{
    int arcs[10][10];
    int vexnum,arcnum;
}Graph;

bool visited[10];//定义数组判断顶点是否已被访问
queue <int> q;
 
Graph Init_Graph(Graph a){//初始化t图 
    int i,j,m,n;
    for(i=0;i<a.vexnum;i++){
        visited[i]=false;//把bool类型的数组都初始化为false,用于判断是否被访问 
        for(j=0;j<a.vexnum;j++){ 
            a.arcs[i][j]=0;//把图的二维数组全部初始化为0
        }      
    }
    cin>>a.vexnum>>a.arcnum;    
    for(i=0;i<a.arcnum;i++){ 
        cin>>m>>n;
        a.arcs[m][n]=1; 
        a.arcs[n][m]=1;//使对应的两个二维数组的值为1
    }
    return a;
}
 
void DFS(Graph a,int b)//深搜 
{
    visited[b]=true;//使顶点对应的visited数组为true,表示顶点已被访问过
    cout<<b<<" ";
    for(int i=0;i<a.vexnum;i++){ 
        if(a.arcs[b][i]==1 && visited[i]==false)DFS(a,i);//若顶点对应的邻接点未被访问,则递归调用DFS函数
    }
}

void BFS(Graph a,int b){ //广搜
    int temp;
    while(!q.empty()){
        temp=q.front();
        q.pop();   
        cout<<temp<<" ";
        for(int i=0;i<a.vexnum;i++){ 
            if(a.arcs[temp][i]==1 && visited[i]==false){//若顶点对应的邻接点未被访问,邻接点入队
                q.push(i);
                visited[i]=true;//邻接点对应的visited数组取true,表示已被访问
            }
        }
    visited[b]=true;//第一次入队的顶点对应的visited数组值取true,表示已被访问
    }
}
 
int main(){ 
    Graph a;
    a=Init_Graph(a);
    int i;
    for(i=0;i<a.vexnum;i++){ 
        if(visited[i]==false){//若有顶点未被访问,则循环调用DFS函数
            cout<<"{ ";
            DFS(a,i);
            cout<<"}"<<endl;
        }
    }
    for(i=0;i<a.vexnum;i++)visited[i]=false;//把visited数组初始化为false
    for(i=0;i<a.vexnum;i++){//若有顶点未被访问,则循环调用BFS函数
        if(visited[i]==false){ 
            q.push(i);
            cout<<"{ ";
            BFS(a,i);
            cout<<"}"<<endl;
        }
    }
    return 0;
}
View Code

 

图的内容较于前面的内容显得更加丰富也更加复杂,感觉自己很多内容并没有很好地跟上,还有很多内容需要钻研。

 

 

posted @ 2019-05-19 21:54  Marshall·Wayne  阅读(147)  评论(2编辑  收藏  举报