zoukankan      html  css  js  c++  java
  • 删除实现图的构造、DFS、BFS 以及图的删除实现

    首先声明,我是一个菜鸟。一下文章中出现技术误导情况盖不负责

    #include<iostream>
    #define maxsize 30
    #define NULLDATA -1
    /*
     
    功能:邻接表存储图、DFS、BFS 以及 删除图
    
    */
    
    using namespace std;
    
    typedef struct e_node *link;
    
    typedef struct e_node //邻接顶点
    {
      int visit;          //节点序号
      link next;          //下一个节点地址
    
    }e_node;
    
    typedef struct v_node   // 顶点
    {
      int info;
      link next_v;          //边节点链表头部
    
    }v_node;
    
    typedef struct graph 
    {
      v_node vertexs[maxsize];
      int vexnum;
      int arcnum;
      int flag[maxsize];
    } graph;
    
    graph *G = (graph *)malloc(sizeof(graph));
    
    /*队列定义和函数部分 (BFS中用到队列)*/
    
    #define  ElemType int      //队列定义部分
    #define NUM_NULL -1
    #define maxsize_queue 20
    typedef struct Queue
    {
      ElemType data[maxsize_queue];
      int front,rear;
    }Queue;
    Queue *q;
    
    
    /*  图部分函数*/
    
    void Init()       //初始化图
    { 
      for(int i = 0; i < maxsize; i++)
      { 
        
        G->vertexs[i].info = NULLDATA;
    	G->vertexs[i].next_v = NULL;
      }
      memset(G->flag,0,maxsize);
      cout<<"input the  arcnum:"<<endl;  //输入顶点个数和边数
     
      cin>>G->arcnum;
    }                
    
    void edge_add()  //输入边来结构图 
    {
      int v1,v2;
      int k = 0;
      link ptr;
      do
      {
      
      do
      {cout<<"input the edge: "<<endl;
      cin>>v1;
      cin>>v2;
      }while(v1 >= maxsize || v2 >= maxsize);
      v1--;v2--;
      G->vertexs[v1].info = v1;
      G->vertexs[v2].info = v2;
      if(G->vertexs[v1].next_v == NULL)
      {
       cout<<"Hello"<<endl;
       G->vertexs[v1].info = v1; 
       G->vertexs[v1].next_v = NULL;
      
      }
      
      if(G->vertexs[v1].next_v == NULL )
      {
        G->vertexs[v1].next_v = (link)malloc(sizeof(e_node));
    	G->vertexs[v1].next_v->visit = v2;
    	G->vertexs[v1].next_v->next = NULL;
      
      }
       else
       {
        link p =(link)malloc(sizeof(e_node));
        p->visit = v2;
    	p->next = NULL;
    	ptr = G->vertexs[v1].next_v;
        while(ptr->next != NULL) 
    	  ptr = ptr->next;
        ptr->next = p;
      
       }
      k++;
      }while(k < G->arcnum );
    
      if(k == G->arcnum)
    	  cout<<"The edge is full...."<<endl;
    }
    
    void delete_graph()    //删除图
    { link p1,p2;
      for(int i = 0; i < G->vexnum; i++)
      {
        p1 = p2 = G->vertexs[i].next_v;
    	while(p1)
    	{
    	  p2 = p1->next;
    	  delete p1;
          p1 = p2;
          cout<<i<<"is been done."<<endl;
    	}
      
      }
    
    }
    
    
    
    void DFS(int v)                      //DFS实现
    {
      link ptr;                             //DFS用头指针节点
      G->flag[v] = 1;
      cout<<G->vertexs[v].info<<endl;
      ptr = G->vertexs[v].next_v;
     
      while(ptr != NULL)
      { 
        if(G->flag[ptr->visit] == 0)
    	{
    	  DFS(ptr->visit);
    	
    	}
    	
    	ptr = ptr->next;
      }
    
      return ;
    
    
    }
    
    /*队列部分函数*/
    
    void Init_queue()
    {
      q=(Queue *)malloc(sizeof(Queue));
      q->front=q->rear=0;
    }
    
    void in(ElemType v)
    {
      q->data[q->rear]=v;
      q->rear++;
    
    }
    
    ElemType out()
    {
      ElemType tmp;
      tmp=q->data[q->front];
      q->front++;
      return tmp;
    
    }
    
    bool empty_queue()
    {
    
      return q->front == q->rear;
    }
    
    /*BFS实现部分*/
    
    void BSF(int v)
    {link p;
      G->flag[v] = 1;
      in(v);
      while(!empty_queue())
      { 
        int k = out();
    	
    	 p = G->vertexs[k].next_v;
    	 
    	cout<<G->vertexs[k].info<<endl;
    	
    	while(p)
    	{ 
    	  int j = p->visit;
    	  if(G->flag[j] == 0)
    	  {
    	    G->flag[j] = 1;
    		
    		in(j);
    	  }
    	p = p->next;
    	}
      
      }
    
    }
    
    int main()  
    {   
      Init();                           //初始化图
      Init_queue();                     //初始化队列
      edge_add();                       //输入边来结构图
      
      cout<<"DFS:--------------"<<endl;  //打印深搜
     
      DFS(0);
      
      cout<<"BFS:------------------"<<endl;    //打印广搜
      memset(G->flag,0,maxsize);               //对标识数组复位后才能重新应用BFS
      BSF(0);
      delete_graph();                          //删除图
      cout<<"over !"<<endl;
      system("pause");
      return 0;
    }
        每日一道理
    成熟是一种明亮而不刺眼的光辉,一种圆润而不腻耳的音响,一种不须要对别人察颜观色的从容,一种终于停止了向周围申诉求告的大气,一种不理会哄闹的微笑,一种洗刷了偏激的淡漠,一种无须声张的厚实,一种并不陡峭的高度。

        
    只能在Dev C++ 下运行。

        输入示例:(1,2)(1,4)(1,5)(2,3)(2,5)(4,6)(5,6)(6,7)(7,8)。

        总结:

        1、BFS中的队列未应用STL。

        2、代码混乱。

        3、对图算法认识须要跟多熟习。

    文章结束给大家分享下程序员的一些笑话语录: 一程序员告老还乡,想安度晚年,于是决定在书法上有所造诣。省略数字……,准备好文房4宝,挥起毛笔在白纸上郑重的写下:Hello World

    --------------------------------- 原创文章 By
    删除和实现
    ---------------------------------

  • 相关阅读:
    积性函数大全(欧拉函数、莫比乌斯反演、杜教筛……)
    Codeforces 1427 G.One Billion Shades of Grey
    Codeforces Global Round 11 A-F题解
    一般难度模板复习
    (补充)证明线性递推相关的Hamilton-Cayley定理
    [ZJOI2018]树
    [ICPC-Beijing 2006]狼抓兔子
    P4869 albus就是要第一个出场
    浅谈算法——线性基
    [COCI2017-2018#1] Deda
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/3100803.html
Copyright © 2011-2022 走看看