zoukankan      html  css  js  c++  java
  • 与图相关的算法

    Graphtest.h

    代码
    /* c1.h (程序名) */
     #include
    <string.h>
     #include
    <ctype.h>
     #include
    <malloc.h> /* malloc()等 */
     #include
    <limits.h> /* INT_MAX等 */
     #include
    <stdio.h> /* EOF(=^Z或F6),NULL */
     #include
    <stdlib.h> /* atoi() */
     #include
    <io.h> /* eof() */
     #include
    <math.h> /* floor(),ceil(),abs() */
     #include
    <process.h> /* exit() */
     
    /* 函数结果状态代码 */
     
    #define TRUE 1
     
    #define FALSE 0
     
    #define OK 1
     
    #define ERROR 0
     
    #define INFEASIBLE -1
     
    /* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
     typedef 
    int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
     typedef 
    int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */


    #define MAX_NAME 5  /*顶点字符串的最大长度+1 */
    typedef 
    int VRType;
    typedef 
    char InfoType;
    typedef 
    char VertexType[MAX_NAME];

    #define INFINITY INT_MAX
    #define MAX_VERTEX_NUM 20
    typedef 
    enum{DG,DN,AG,AN}GraphKind;

    typedef 
    struct ArcCell{
        VRType adj;
    //顶点关系类型
        InfoType *info;
    }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

    typedef 
    struct 
    {
        VertexType vexs[MAX_VERTEX_NUM];
        AdjMatrix arcs;
        
    int vexnum,arcnum;
        GraphKind kind;
    }MGraph;

    fun.h

    代码
    Status LocateVex(MGraph G,VertexType u);
    Status CreateFAG(MGraph 
    *G);
    void Display(MGraph G);
    Status Visit(VertexType v);
    int FirstAdjVex(MGraph G,int v);
    int NextAdjVex(MGraph G,int v,int w);
    Status Visit(VertexType v);
    void DFSTraverse(MGraph G,Status (* Visit)(VertexType v));
    void DFS(MGraph G,int v);
    void BFSTraverse(MGraph G, Status(* Visit)(VertexType v));

    Queue.h

    代码
    typedef int QElemType;
    typedef 
    struct QNode
    {
        QElemType data;
        
    struct QNode *next;
    }QNode,
    *QueuePtr;

    typedef 
    struct
    {
        QueuePtr front,rear;
    }LinkQueue;


    Status InitQueue(LinkQueue 
    *Q)
    {
        (
    *Q).front=(*Q).rear=(QueuePtr)malloc(sizeof(QNode));
        
    if(!(*Q).front)
            exit(OVERFLOW);
        (
    *Q).front->next=NULL;
        
    return OK;
    }

    Status EnQueue(LinkQueue 
    *Q,QElemType e)
    {
        QueuePtr p
    =(QueuePtr)malloc(sizeof(QNode));
        
    if(!p)
            exit(OVERFLOW);
        p
    ->data=e;
        p
    ->next=NULL;
        (
    *Q).rear->next=p;
        (
    *Q).rear=p;
        
    return OK;
    }

    Status DeQueue(LinkQueue 
    *Q,QElemType *e)
    {
        QueuePtr p;
        
    if((*Q).front==(*Q).rear)
            
    return ERROR;
        p
    =(*Q).front->next;
        
    *e=p->data;
        (
    *Q).front->next=p->next;
        
    if((*Q).rear==p)
            (
    *Q).rear=(*Q).front;
        free(p);
        
    return OK;
    }

    Status QueueEmpty(LinkQueue Q)
    {
        
    if(Q.front==Q.rear)
            
    return TRUE;
        
    else
            
    return FALSE;
    }

    Traverse.cpp

    代码
    //#include "Graphtest.h"
    #include "stdafx.h"
    #include 
    "Graphtest.h"
    #include 
    "fun.h"

    Boolean visited[MAX_VERTEX_NUM];
    Status (
    *VisitFunc)(VertexType v);


    int LocateVex(MGraph G,VertexType u)
    {
        
    int i;
        
    for(i=0;i<G.vexnum;i++)
            
    if(strcmp(u,G.vexs[i])==0)
                
    return i;
        
    return -1;
    }

    Status CreateFAG(MGraph 
    *G)
    {
        
    int i,j,k;
        
    char filename[13];
        VertexType va,vb;
        FILE 
    *graphlist;
        printf(
    "please input data filename(f7-1.dat):\n");
        scanf(
    "%s",filename);
        graphlist
    =fopen(filename,"r");
        
        fscanf(graphlist,
    "%d",&(*G).vexnum);
        fscanf(graphlist,
    "%d",&(*G).arcnum);

        
    for(i=0;i<(*G).vexnum;i++)
        {
            fscanf(graphlist,
    "%s",(*G).vexs[i]);
            printf(
    "%s\t",(*G).vexs[i]);
        }

        
    for(i=0;i<(*G).vexnum;i++)
            
    for(j=0;j<(*G).vexnum;j++)
            {
                (
    *G).arcs[i][j].adj=0;
                (
    *G).arcs[i][j].info=NULL;
            }

        
    for(k=0;k<(*G).arcnum;k++)
        {
            fscanf(graphlist,
    "%s%s",va,vb);
            i
    =LocateVex(*G,va);
            j
    =LocateVex(*G,vb);
            (
    *G).arcs[i][j].adj=(*G).arcs[j][i].adj=1;
        }

        fclose(graphlist);
        (
    *G).kind=AG;
        
        
    return OK;
    }


    void Display(MGraph G)
    {
        
    int i,j;
        
    char s[7],s1[3];
        
    switch(G.kind)
        {
            
    case DG:strcpy(s,"有向图\0");
                strcpy(s1,
    "弧\0");
                
    break;
                 
    case DN: strcpy(s,"有向网\0");
                  strcpy(s1,
    "弧\0");
                  
    break;
         
    case AG: strcpy(s,"无向图\0");
                  strcpy(s1,
    "边\0");
                  
    break;
         
    case AN: strcpy(s,"无向网\0");
                  strcpy(s1,
    "边\0");
       }

        printf(
    "%d个顶点%d条%s的%s\n",G.vexnum,G.arcnum,s1,s);

        
    for(i=0;i<G.vexnum;++i)
            printf(
    "G.vexs[%d]=%s\n",i,G.vexs[i]);
        printf(
    "G.arcs.adj:\n");
        
    for(i=0;i<G.vexnum;i++)
        {
            
    for(j=0;j<G.vexnum;j++)
                printf(
    "%6d",G.arcs[i][j].adj);
            printf(
    "\n");
        }
        printf(
    "G.arcs.info:\n");
        printf(
    "顶点1(弧尾) 顶点2(弧头) 该%s信息:\n",s1);
        
    if(G.kind<2)
            
    for(i=0;i<G.vexnum;i++)
                
    for(j=0;j<G.vexnum;j++)
                {
                    
    if(G.arcs[i][j].info)
                        printf(
    "%5s %11s   %s\n",G.vexs[i],G.vexs[j],G.arcs[i][j].info);
                }
        
    else
        {
            
    for(i=0;i<G.vexnum;i++)
                
    for(j=i+1;j<G.vexnum;j++)
                    
    if(G.arcs[i][j].info)
                        printf(
    "%5s %11s     %s\n",G.vexs[i],G.vexs[j],G.arcs[i][j].info);
       }
     }


    int FirstAdjVex(MGraph G,int v)
    {
        
    int i;
        
    for(i=0;i<G.vexnum;i++)
            
    if(G.arcs[v][i].adj!=0)
                
    return i;
        
    return -1;
    }

    int NextAdjVex(MGraph G,int v,int w)
    {
        
    int i;
        
    for(i=w+1;i<G.vexnum;i++)
            
    if(G.arcs[v][i].adj!=0)
                
    return i;
        
    return -1;
    }


    Status Visit(VertexType v)
    {
        printf(
    " visit %s\n",v);
        
    return OK;
    }

    void DFSTraverse(MGraph G,Status (* Visit)(VertexType v))
    {
        
    int v;
        VisitFunc
    =Visit;
        
    for(v=0;v<G.vexnum;v++)
            visited[v]
    =FALSE;
        
    for(v=0;v<G.vexnum;v++)
            
    if(!visited[v])
                DFS(G,v);
    }

    void DFS(MGraph G,int v)
    {
        
    int w;
        visited[v]
    =true;
        VisitFunc(G.vexs[v]);
        
    //Visit(G.vexs[v]);
        for(w=FirstAdjVex(G,v);w>=0;w=NextAdjVex(G,v,w))
            
    if(!visited[w])
                DFS(G,w);
    }

    #include 
    "Queue.h"
    void BFSTraverse(MGraph G, Status(* Visit)(VertexType v))
    {
        
    int v,u,w;
        LinkQueue Q;
        
    for(v=0;v<G.vexnum;v++)
            visited[v]
    =FALSE;
        InitQueue(
    &Q);
        
    for(v=0;v<G.vexnum;v++)
        {
            
    if(!visited[v])
            {
                visited[v]
    =TRUE;
                Visit(G.vexs[v]);
                EnQueue(
    &Q,v);
                
    while(!QueueEmpty(Q))
                {
                    DeQueue(
    &Q,&u);
                    
    for(w=FirstAdjVex(G,u);w>=0;w=NextAdjVex(G,u,w))
                    {
                        
    if(!visited[w])
                        {
                            visited[w]
    =true;
                            Visit(G.vexs[w]);
                            EnQueue(
    &Q,w);
                        }
                    }
                }
            }
        }
    }


    Graphtest.cpp

    代码
    #include "stdafx.h"
    #include 
    "Graphtest.h"
    #include 
    "fun.h"



    int _tmain(int argc, _TCHAR* argv[])
    {
        MGraph g;
        CreateFAG(
    &g);
        Display(g);

        printf(
    "now DFS the Graph:\n");
        DFSTraverse(g,Visit);

        printf(
    "now BFS the Graph:\n");
        BFSTraverse(g,Visit);

        
    while(1);
        
    return 0;
    }

  • 相关阅读:
    存储过程中Like没有数据?
    鼠标放上图片移动,字体移动
    Excel
    参数无效。区域性ID2155(0X086B)不是受支持的区域性
    JVM指令集及各指令的详细使用说明[转的]
    BTrace使用简介
    ST表
    树剖模板
    AjaxControlToolkit中的CalendarExtender被遮挡及日期格式本地化解决方法
    Using Beyond Compare with TFS
  • 原文地址:https://www.cnblogs.com/newgreen/p/1853675.html
Copyright © 2011-2022 走看看