p349图的DFS

来源:互联网 发布:mcs51单片机数据总线 编辑:程序博客网 时间:2024/06/10 04:57
  • 之前都是零零散散知道些DFS(现在还是零零散散),现在发现时间戳这个东西很有用哈 ,可以瞬间判断两个节点在搜索树中的关系,还可以判断边的类型,期待以后发挥用武之地吧

写这段代码的感受:

  • 之前在写BFS的时候,图的点数啊,边数啊什么的都没有集成在一起,这次首先用一个G里面包括了点数v,边数e,点集g(指针);g[i]是node类型,包括d,f(和书中的意义相同),color,和指向第一条边的指针next;最后edge里面只有边的终点i和指向下一条边的指针next。这样,一个图的所有属性都包含在G里面了,总之写起来很舒服
  • 之前一直不知道条件编译是干什么的,现在发现在检查程序中间结果的时候,它还是很方便的啦
  • 最后不得不说变量起好了名字代码写起来舒服很多啊
#define debug 0#include<stdio.h>#include<stdlib.h>#define white 1#define gray 2#define black 3typedef struct edge{    int i;    struct edge *next;}edge;typedef struct node{    int d,f,color;    edge *next;}node;typedef struct gve{    int v,e;    node *g;}gve;int insert(node *pnode,int i){    edge *new;    new=(edge *)malloc(sizeof(edge));    new->i=i;    new->next=pnode->next;    pnode->next=new;    return 0;}#if debugint print(gve G){    int i;    edge *tmp;    printf("This is for debug!\n");    printf("%d %d\n",G.v,G.e);    for (i=1;i<=G.v;i++)    {        printf ("%d: ",i);        tmp=G.g[i].next;        while (tmp!=NULL)        {            printf("%d ",tmp->i);            tmp=tmp->next;        }        printf("\n");    }    printf("end!\n");    return 0;}#endifint dfsvisit(gve G,node *pnode,int *time){    edge *tmp=pnode->next;    (*time)++;    pnode->d=*time;    pnode->color=gray;    while (tmp!=NULL)    {        if (G.g[tmp->i].color==white)            dfsvisit(G,&G.g[tmp->i],time);        tmp=tmp->next;    }    pnode->color=black;    (*time)++;    pnode->f=*time;    return 0;}int dfs(gve G){    int time=0,i;    for (i=1;i<=G.v;i++)        if (G.g[i].color==white)            dfsvisit(G,&G.g[i],&time);    return 0;}int printtree(gve G){    int i;    for (i=1;i<=G.v;i++)        printf("%d: color %d d %d f %d\n",i,G.g[i].color,G.g[i].d,G.g[i].f);    return 0;}int main(void){    int i;    gve G;    scanf("%d%d",&G.v,&G.e);    G.g=(node *)malloc(sizeof(node)*(G.v+1));    for (i=1;i<=G.v;i++)    {        G.g[i].next=NULL;        G.g[i].color=white;    }    int s,d;    for (i=1;i<=G.e;i++)    {        scanf("%d%d",&s,&d);        insert(&G.g[s],d);    }    #if debug         print(G);    #endif    dfs(G);    printtree(G);    return 0;}
0 0