zoukankan      html  css  js  c++  java
  • 邻接表的创建及应用

    #include<stdio.h>
    #include<stdlib.h>
    #define MAX 20
    typedef char vextype;
    //
    typedef  struct  node{      //定义边结点的类型
       int adjver;   //边的邻接点的数据(顶点的序号)
       struct  node  *next; //指向本边下一邻接点的指针
    }edgeNode;
    
    //顶点
    typedef  struct {   //定义顶点的类型
       vextype  vertex;     //顶点的数据
       edgeNode  *link;    //指向本边邻接表
    }verNode;
    
    //
    typedef  struct {
       verNode adjlist[MAX];
       int n,e;  //n-顶点数,e-边数
    }link_graph;
    
     //创建无向图
     void CreateGraph(link_graph &g)
     {
         printf("--------------图的创建开始------------
    ");
    
         printf("输入顶点的个数及边的个数:
    ");
    
         scanf("%d%d",&g.n,&g.e);
    
         for(int i=0;i<g.n;i++)
         {
             g.adjlist[i].vertex = (char)(i+65);//顶点赋值
             g.adjlist[i].link = NULL;         //初始化link
         }
    
         printf("输入边值:
    ");
    
         //创建无向图
         for(int i=0;i<g.n;i++)
         {
             int n,m;
             scanf("%d%d",&n,&m);
    
             edgeNode * p = (edgeNode*)malloc(sizeof(edgeNode));
             p->adjver = m;
             p->next = g.adjlist[n].link;
             g.adjlist[n].link = p;
    
             p = (edgeNode*)malloc(sizeof(edgeNode));
             p->adjver = n;
             p->next = g.adjlist[m].link;
             g.adjlist[m].link = p;
    
    
         }
         printf("--------------图的创建结束------------
    ");
     }
    
     void PrintGraph(link_graph g)
     {
         printf("--------------图的输出开始------------
    ");
    
         for(int i=0;i<g.e;i++)
         {
            printf("%2d[%2c]-->[",i,g.adjlist[i].vertex);
            edgeNode * p = g.adjlist[i].link;
            while(p)
            {
                 int j;
                 printf("%2d,",p->adjver);
                 p=p->next;
            }
            printf(" ^ ]
    ");
         }
    
         printf("--------------图的输出结束------------
    
    ");
     }
    int count;
    int visited[MAX];
    void DFS(link_graph g,int v)
    {
        count++;
        visited[v]=1;
        printf("%d ",v);
        edgeNode * p = g.adjlist[v].link;
    
        while(p)
        {
            int j = p->adjver;
            if(!visited[j])
            {
                DFS(g,j);
    
            }
            p = p->next;
        }
    }
    
    //深度优先遍历
    void DFS_AL(link_graph g)
    {
        int num=0;
         for(int i=0;i<g.n;i++)
         {
             visited[i]=0;
         }
    
         for(int i=0;i<g.n;i++)
         {
             count = 0;
             if(!visited[i])
             {
                 DFS(g,i);
                 printf("-->%d
    ",count);//输出每个连通图中的顶点下标
                 num++;
             }
    
         }
         printf("连通图的个数为:%d
    ",num);
    }
    int main()
    {
        link_graph G;
        //创建图
        CreateGraph(G);
        //打印图
        PrintGraph(G);
        //深度优先遍历
        DFS_AL(G);
    
    }

    邻接表的创建及连通子图个数求解

  • 相关阅读:
    ZOJ 2158 Truck History
    Knight Moves (zoj 1091 poj2243)BFS
    poj 1270 Following Orders
    poj 2935 Basic Wall Maze (BFS)
    Holedox Moving (zoj 1361 poj 1324)bfs
    ZOJ 1083 Frame Stacking
    zoj 2193 Window Pains
    hdu1412{A} + {B}
    hdu2031进制转换
    openjudge最长单词
  • 原文地址:https://www.cnblogs.com/wwww2/p/11990297.html
Copyright © 2011-2022 走看看