图详细解答!

#include<iostream>
#include<stdlib.h>
#define maxvn 10

using namespace std;
typedef char VertexType;

//定义图的存储数据类型 
typedef struct ArcNode{
    int adjvesx;
    struct ArcNode *nextarc;
    int info;
}ArcNode;
typedef struct VNode{
    VertexType data;
    ArcNode *firstarc; 
}VNode,AdjList[maxvn];
typedef struct{
    AdjList vertices;
    int Vnum,Anum;
}AdjGraph;

//定义一个全局标识数组 
int visited[maxvn];

int LocateVex(char u,AdjGraph G)
{
    int i;
    for(i=0;i<G.Vnum;i++)
    {
        if(u==G.vertices[i].data)
            return i;
    }
    if(i==G.Vnum)
    {
        cout<<"ERROR!"<<endl;
        exit(1); 
    }
    return 0;
}

//创建图 
void CreatAdjGraph_adjList(AdjGraph &G)
{
    ArcNode *p;
    cout<<"Please input Vnum and Anum:"<<endl;
    cin>>G.Vnum>>G.Anum;
    cout<<"Please input Vertices:"<<endl;//创建表头 
    for(int i=0;i<G.Vnum;i++)
    {
        cin>>G.vertices[i].data;
        G.vertices[i].firstarc=NULL;
    }
    cout<<"Please input Arc[i][j]:"<<endl;//创建链表
    for(int k=0;k<G.Anum;k++)
    {
        p=(ArcNode*)malloc(sizeof(ArcNode));
        char v1,v2;
        cin>>v1>>v2;
        int i=LocateVex(v1,G);
        int j=LocateVex(v2,G);
        int w;
        cin>>w;
        p->adjvesx=j;
        p->info=w;
        p->nextarc=G.vertices[i].firstarc;
        G.vertices[i].firstarc=p; 
    } 
}

//深搜算法 
void DFS(AdjGraph G,int i)
{
    ArcNode*p;
    visited[i]=1;
    p=G.vertices[i].firstarc;
    while(p)
    {
        if(!visited[p->adjvesx])
        {
            visited[p->adjvesx]=1;
            cout<<p->adjvesx<<endl;
        }

        p=p->nextarc;
    }
    return;
}

//调用深搜算法 
void DFSTraverse(AdjGraph G)
{
    for(int i=0;i<G.Vnum;i++)
        visited[i]=0;
    for(int i=0;i<G.Vnum;i++)
    {
        if(!visited[i])
            DFS(G,i);
    }
}

//主函数 
int main()
{
    AdjGraph G;
    CreatAdjGraph_adjList(G);
    DFSTraverse(G);
    return 0;

 

void DFS(GraphAMatrix G,int i,int *visited)
{
    int j;
    if(visited[i])
        return ;//若结点被遍历过 返回 
    else
    {
        cout<<i<<endl;
        visited[i]=1;
        //遍历与该结点相邻的结点 (从第一个开始) 
        for(j=0;j<G.numVertexs;j++)
        {
            if(!visited[i]&&G.Edge[i][j])
                DFS(G,j,visited);//从相邻结点的第一个进行递归式深搜遍历 
        }
    }

void DFS_GreahDG(GreapAMstrix G)
{
    int i,j,e;
    int *visited;//为每一个结点设置一个初始标志为未遍历 
    visited=(int *)malloc(sizeof(int)*G.numVertexs);
    memset(visited,0,sizeof(int)*G.numVertexs);
    //对每一个未被遍历结点进行DFS深度搜索 
    for(i=0;i<G.numVertexs;i++)
    {
        if(!visited[i])
            DFS(G,i,visited);//调用深搜算法 
    }
    free(visited);//释放指针 
    printf("\n");

 

 

void BFS_Graph(GraphAMatrix G){
    //图的广度优先遍历
    int i,j,e;//i j 为循环控制变量 e为取队列元素变量
    CQueue  Q;
    int *visited = (int *)malloc(sizeof(int)*G.numVertexes);//标记数组
    InitCQueue(&Q);
    for(int i=0;i<G.numVertexes;i++){
        //遍历所有顶点 非连通图的情况化 要遍历全部加上循环
        if(!visited[i]){
            printf("%d",i);
            visited[i] = 1;
            EnCQueue(&Q,i);//起点入队列
            while(!CQueue(Q)){//循环操作
                DeQueue(&Q,&e);//出队列
                for(int j=0;j<G.numVertexes;j++){
                    //遍历顶点集合
                    if(!visited[j]&&G.edges[e][j]){
                        //判断当前结点是否被访问过 且与出队结点是否相连
                        printf("%d",j);
                        visited[j] = 1;
                        EnCQueue(&Q,j); 
                    } 
                } 
            } 
        } 
    } 
    free(visited);
    printf("\n");

 

 

void BFS_GraphADJList(GraphADJList G){
    //图的广度优先遍历
    int i,j,e;//i j 为循环控制变量 e为取队列元素变量
    CQueue  Q;
    EdgeNode *p; 
    int *visited = (int *)malloc(sizeof(int)*G.numVertexes);//标记数组
    InitCQueue(&Q);
    for(int i=0;i<G.numVertexes;i++){
        //遍历所有顶点 非连通图的情况化 要遍历全部加上循环
        if(!visited[i]){
            printf("%d",i);
            visited[i] = 1;
            EnCQueue(&Q,i);//起点入队列
            while(!CQueue(Q)){//循环操作
                DeQueue(&Q,&e);//出队列
                p = G.adjList[e].firstedge;//从顶点的链表的第一个边结点开始 
                while(p){
                    j = p->adjvex;//记录当前边的终点序号 
                    if(!visited[j]){
                        printf("%d",j);
                        visited[j] = 1;
                        EnCQueue(&Q,j); 
                    } 
                    p = p->next;//移动到下一条边 
                }
            } 
        } 
    } 
    free(visited);
    printf("\n");

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值