zoukankan      html  css  js  c++  java
  • 1047图的深度优先遍历c语言

    描述

    图(graph)是数据结构 G=(V,E),其中V是G中结点的有限非空集合,结点的偶对称为边(edge);E是G中边的有限集合。设V={0,1,2,……,n-1},图中的结点又称为顶点(vertex),有向图(directed graph)指图中代表边的偶对是有序的,用<u,v>代表一条有向边(又称为弧),则u称为该边的始点(尾),v称为边的终点(头)。无向图(undirected graph)指图中代表边的偶对是无序的,在无向图中边(u,v )和(v,u)是同一条边。

    输入边构成无向图,求以顶点0为起点的深度优先遍历序列。

    输入

     

    第一行为两个整数ne,表示图顶点数和边数。以下e行每行两个整数,表示一条边的起点、终点,保证不重复、不失败。1n20,0e190

    输出

     

    前面n行输出无向图的邻接矩阵,最后一行输出以顶点0为起点的深度优先遍历序列,对于任一起点,首先遍历的是终点序号最小的、尚未被访问的一条边。每个序号后输出一个空格。

    样例输入

    4 5
    0 1
    0 3
    1 2
    1 3
    2 3

    样例输出

    0 1 0 1 
    1 0 1 1 
    0 1 0 1 
    1 1 1 0 
    0 1 2 3 

     代码:

    #include<stdio.h>
    #include<malloc.h>
    
    
    typedef struct graph      //图的结构体
    {
        int Vertices;       //顶点数
        int **A;             //图的二维矩阵
    }Graph;
    
    void CreateGraph(Graph *g,int n)          //创建一个、包含了n个顶点的图
    {
        int i,j;
        g->Vertices = n;
        g->A = (int**)malloc(n*sizeof(int*));
        for(i = 0;i < n;i++)
        {
            g->A[i] = (int*)malloc(n*sizeof(int));
            for(j = 0;j < n;j++)
                g->A[i][j] = 0;
        }
    }
    
    int Add(Graph *g,int u,int v)    //在图g中添加一条边(u,v)
    {
        int n = g->Vertices;
        if(u<0||v<0||u>n-1||v>n-1||g->A[u][v]!=0)  //不知道为什么这里不要判断u==v的情况
        {
            return 0;
        }
        g->A[u][v]=1;
        return 1;
    }
    
    
    int Exist(Graph g,int u,int v)  //判断图中是否存在边(u,v)
    {
        int n;
        n = g.Vertices;
        if(u<0||v<0||u>n-1||v>n-1||g.A[u][v]==0)
            return 0;
        return 1;
    }
    
    void DFS(Graph g,int v,int *visited)   //深度遍历图
    {
        int w;
        visited[v]=1;
        printf("%d ",v);
        for(w=0;w<g.Vertices;w++)
        {
            if(Exist(g,v,w)&&visited[w]!=1)
                DFS(g,w,visited);
        }
    }
    
    
    int main()
    {
        int enumber,vnumber,one,two,i,j;
        Graph g;
        int visited[20];
        
        scanf("%d %d",&vnumber,&enumber);   //vnumber为图中顶点的个数,enumber为图中边的条数
        if(1<=vnumber<=20&&0<=enumber<=190)
        {
            CreateGraph(&g,vnumber);    //创建一个图
        }
        else 
            return 0;
        
        for(i=0;i<enumber;i++)    //向图中添加边
        {
            scanf("%d %d",&one,&two);
            Add(&g,one,two);
            Add(&g,two,one);
        }
    
        for(i=0;i<vnumber;i++)  //将图的邻接矩阵输出
        {
            for(j=0;j<vnumber;j++)
            {
                if(Exist(g,i,j))
                    printf("%d ",1);
                else
                    printf("%d ",0);
            }
            printf("
    ");
        }
    
        for(i=0;i<g.Vertices;i++)   //visited[]为每个顶点的标志位,用来判断顶点是否被访问过,0表示没有被访问。
        {
            visited[i]=0;
        }
        for(i=0;i<g.Vertices;i++)
        {
            if(visited[i]!=1)      //深度遍历图
                DFS(g,i,visited);
        }
        printf("
    ");
        return 1;
    }
  • 相关阅读:
    socket的一个错误的解释SocketException以及其他几个常见异常
    lambda表达式和ef的语句转化
    多线程的异步委托初识
    跨线程访问控件的方法
    P1337 [JSOI2004]平衡点 / 吊打XXX
    P4099 [HEOI2013]SAO
    UVA10529 Dumb Bones
    P1291 [SHOI2002]百事世界杯之旅
    P2675 《瞿葩的数字游戏》T3-三角圣地
    P4363 [九省联考2018]一双木棋chess
  • 原文地址:https://www.cnblogs.com/rolly-yan/p/3565310.html
Copyright © 2011-2022 走看看