C语言中的BFS算法

C语言中的BFS算法,c,algorithm,binary-tree,breadth-first-search,C,Algorithm,Binary Tree,Breadth First Search,我试图在C语言中找到一个BFS算法,但我找不到一个真正有效的算法。我有一个二进制堆(树实现),我想做的是使用BFS算法,以便找到在树中插入新元素的正确位置 p.S我不知道要插入的元素的确切数目(如果有帮助的话)。插入二进制堆不需要使用BFS 书中出现的程序的通用实现是什么 《编程挑战:编程竞赛培训手册》作者 史蒂文·斯基纳和米格尔·雷维拉,斯普林格·维拉格,纽约,2003年 #定义真1 #定义FALSE 0 #定义MAXV 100/*最大顶点数*/ #定义顶点的MAXDEGREE 50/*最大o

我试图在C语言中找到一个BFS算法,但我找不到一个真正有效的算法。我有一个二进制堆(树实现),我想做的是使用BFS算法,以便找到在树中插入新元素的正确位置


p.S我不知道要插入的元素的确切数目(如果有帮助的话)。

插入二进制堆不需要使用BFS

书中出现的程序的通用实现是什么

《编程挑战:编程竞赛培训手册》作者 史蒂文·斯基纳和米格尔·雷维拉,斯普林格·维拉格,纽约,2003年

#定义真1
#定义FALSE 0
#定义MAXV 100/*最大顶点数*/
#定义顶点的MAXDEGREE 50/*最大outdegree*/
类型定义结构{
整数边[MAXV+1][MAXDEGREE];/*邻接信息*/
int度[MAXV+1];/*每个顶点的outdegree*/
int nvertices;/*图中的顶点数*/
int nedges;/*图形中的边数*/
}图形;
#定义队列大小1000
类型定义结构{
int q[QUEUESIZE+1];/*队列主体*/
int first;/*第一个元素的位置*/
int last;/*最后一个元素的位置*/
int count;/*队列元素数*/
}排队;
typedef int bool;
bool已处理[MAXV];/*已处理哪些顶点*/
布尔发现了[MAXV];/*找到了哪些顶点*/
int父项[MAXV];/*发现关系*/
bool finished=FALSE;/*如果为true,请立即停止搜索*/
初始化搜索(图*g)
{
int i;/*计数器*/
对于(i=1;反转;i++){
处理的[i]=发现的[i]=错误;
父[i]=-1;
}
}
bfs(图*g,整数开始)
{
队列q;/*要访问的顶点队列*/
int v;/*当前顶点*/
int i;/*计数器*/
初始化队列(&q);
排队(&q,开始);
发现的[开始]=真;
while(空(&q)==FALSE){
v=出列(&q);
过程_顶点(v);
已处理[v]=真;
对于(i=0;idegree[v];i++)
if(有效的_边(g->边[v][i])==TRUE){
if(发现的[g->边[v][i]]==FALSE){
排队(&q,g->边[v][i]);
发现的[g->边[v][i]]=TRUE;
父[g->边[v][i]]=v;
}
if(已处理的[g->edges[v][i]]==FALSE)
过程_边(v,g->边[v][i]);
}
}
}
/*
布尔有效_边(边e)
{
如果(e.残差>0)返回(真);
否则返回(假);
}
*/
dfs(图*g,整数v)
{
int i;/*计数器*/
int y;/*后继顶点*/
如果(完成)返回;/*允许终止搜索*/
发现[v]=真;
过程_顶点(v);
对于(i=0;idegree[v];i++){
y=g->边[v][i];
if(有效的_边(g->边[v][i])==TRUE){
如果(发现[y]==FALSE){
父[y]=v;
dfs(g,y);
}否则
if(已处理[y]==FALSE)
加工边缘(v,y);
}
如果(完成)返回;
}
已处理[v]=真;
}
查找路径(整数开始、整数结束、整数父项[])
{
如果((开始==结束)| |(结束==-1))
printf(“\n%d”,开始);
否则{
查找路径(开始、父项[结束]、父项);
printf(“%d”,结束);
}
}
/*测试部分*/
进程_顶点(int v)
{
printf(“已处理顶点%d\n”,v);
}
进程_边(整数x,整数y)
{
printf(“已处理边缘(%d,%d)\n”,x,y);
}
布尔有效边(整数e)
{
返回(真);
}
int main()
{
图g;
int i;
读取图形(&g,FALSE);
打印图形(&g);
初始化搜索(&g);
bfs&g,1例;
对于(i=1;i=0;
对于(i=1;idegree[i]=0;
}
读图(图*g,布尔定向)
{
int i;/*计数器*/
int m;/*边数*/
int x,y;/*边(x,y)中的顶点*/
初始化图(g);
scanf(“%d%d”,&(g->n证书),&m);
对于(i=1;idegree[x]>MAXDEGREE)
printf(“警告:插入(%d,%d)超过最大度数\n”,x,y);
g->边[x][g->度[x]]=y;
g->度[x]++;
if(directed==FALSE)
插入_边(g,y,x,真);
其他的
g->nedges++;
}
删除边(图*g,整数x,整数y,布尔定向)
{
int i;/*计数器*/
对于(i=0;idegree[x];i++)
如果(g->边[x][i]==y){
g->度[x]--;
g->边[x][i]=g->边[x][g->度[x]];
if(directed==FALSE)
删除_边(g,y,x,TRUE);
返回;
}
printf(“警告:在g中找不到删除(%d,%d)。\n”,x,y);
}
打印图形(图形*g)
{
int i,j;/*计数器*/
对于(i=1;反转;i++){
printf(“%d:,i”);
对于(j=0;jdegree[i];j++)
printf(“%d”,g->边[i][j]);
printf(“\n”);
}
}
这是排队

init_queue(queue *q)
{
        q->first = 0;
        q->last = QUEUESIZE-1;
        q->count = 0;
}

enqueue(queue *q, int x)
{
        if (q->count >= QUEUESIZE)
        printf("Warning: queue overflow enqueue x=%d\n",x);
        else {
                q->last = (q->last+1) % QUEUESIZE;
                q->q[ q->last ] = x;    
                q->count = q->count + 1;
        }
}

int dequeue(queue *q)
{
        int x;

        if (q->count <= 0) printf("Warning: empty queue dequeue.\n");
        else {
                x = q->q[ q->first ];
                q->first = (q->first+1) % QUEUESIZE;
                q->count = q->count - 1;
        }

        return(x);
}

int empty(queue *q)
{
        if (q->count <= 0) return (TRUE);
        else return (FALSE);
}

print_queue(queue *q)
{
        int i,j;

        i=q->first; 

        while (i != q->last) {
                printf("%c ",q->q[i]);
                i = (i+1) % QUEUESIZE;
        }

        printf("%2d ",q->q[i]);
        printf("\n");
}
init_队列(队列*q)
{
q->first=0;
q->last=QUEUESIZE-1;
q->count=0;
}
排队(队列*q,整数x)
{
如果(q->count>=队列大小)
printf(“警告:队列溢出,队列x=%d\n”,x);
否则{
q->last=(q->last+1)%QUEUESIZE;
q->q[q->last]=x;
q->count=q->count+1;
}
}
int出列(队列*q)
{
int x;
if(q->count q[q->first];
q->first=(q->first+1)%QUEUESIZE;
q->count=q->count-1;
}
复述
initialize_graph(graph *g)
{
    int i;              /* counter */

    g -> nvertices = 0;
    g -> nedges = 0;

    for (i=1; i<=MAXV; i++) g->degree[i] = 0;
}

read_graph(graph *g, bool directed)
{
    int i;              /* counter */
    int m;              /* number of edges */
    int x, y;           /* vertices in edge (x,y) */

    initialize_graph(g);

    scanf("%d %d",&(g->nvertices),&m);

    for (i=1; i<=m; i++) {
        scanf("%d %d",&x,&y);
        insert_edge(g,x,y,directed);
    }
}

insert_edge(graph *g, int x, int y, bool directed)
{
    if (g->degree[x] > MAXDEGREE)
        printf("Warning: insertion(%d,%d) exceeds max degree\n",x,y);

    g->edges[x][g->degree[x]] = y;
    g->degree[x] ++;

    if (directed == FALSE)
        insert_edge(g,y,x,TRUE);
    else
        g->nedges ++;
}


delete_edge(graph *g, int x, int y, bool directed)
{
    int i;              /* counter */

    for (i=0; i<g->degree[x]; i++) 
        if (g->edges[x][i] == y) {
            g->degree[x] --;
            g->edges[x][i] = g->edges[x][g->degree[x]];

            if (directed == FALSE)
                delete_edge(g,y,x,TRUE);

            return;
        }

    printf("Warning: deletion(%d,%d) not found in g.\n",x,y);
}

print_graph(graph *g)
{
    int i,j;            /* counters */

    for (i=1; i<=g->nvertices; i++) {
        printf("%d: ",i);
        for (j=0; j<g->degree[i]; j++)
            printf(" %d",g->edges[i][j]);
        printf("\n");
    }
}
init_queue(queue *q)
{
        q->first = 0;
        q->last = QUEUESIZE-1;
        q->count = 0;
}

enqueue(queue *q, int x)
{
        if (q->count >= QUEUESIZE)
        printf("Warning: queue overflow enqueue x=%d\n",x);
        else {
                q->last = (q->last+1) % QUEUESIZE;
                q->q[ q->last ] = x;    
                q->count = q->count + 1;
        }
}

int dequeue(queue *q)
{
        int x;

        if (q->count <= 0) printf("Warning: empty queue dequeue.\n");
        else {
                x = q->q[ q->first ];
                q->first = (q->first+1) % QUEUESIZE;
                q->count = q->count - 1;
        }

        return(x);
}

int empty(queue *q)
{
        if (q->count <= 0) return (TRUE);
        else return (FALSE);
}

print_queue(queue *q)
{
        int i,j;

        i=q->first; 

        while (i != q->last) {
                printf("%c ",q->q[i]);
                i = (i+1) % QUEUESIZE;
        }

        printf("%2d ",q->q[i]);
        printf("\n");
}
void bfs(int v)
{
    for(i=1;i<=n;i++)
    if(a[v][i] && !visited[i])
    q[++r]=i;
    if(f<=r)
    {
               visited[q[f]]=1;
               bfs(q[f++]);
    }
}
    0
  1   2
3
private void HeapInsert(int node)
{
    if (node == 0)
        return;
    int parent = (node - 1)/2;
    HeapInsert(parent);
    Console.WriteLine("From node {0}, take {1} child to node {2}", parent, (node%2) == 0 ? "right" : "left", node);
}