数据结构1800关于图的代码精选(二)

考研数据结构

图的代码汇总(二)

一、已知无向图G,求图G的连通分量个数

int visited[Max]={0};
int Connectednum(ALGraph g){
  int num=0;
  for(int i=0;i<g.vexnum;i++){
    if(!visited[i]){
      num++;
      DFS(g,i);
    }
  }
  return num;
}
void DFS(ALGraph g,int v){
  visited[v]=1;
  ArcNode p=g.vertices[v].first;
  while(p){
    int j=p->adjvex;
    if(!visited[j]){
      DFS(g,j);
    }
    p=p->next;
  }
}

二、已知无向图采用邻接表存储方式,试写出删除边(i,j)的算法

void delete(ALGraph g, int i,int j){
  ArcNode p=g.vertices[i].first;
  ArcNode pre=p;
  if(p->adjvex==j){
    g.vertices[i].first=p->next;
    free(p);
  }else{
    p=p->next;
    while(p){
      if(p->adjvex==j){
        pre->next=p->next;
        free(p);
      }else{
        pre=p;
        p=p->next;
      }
    }
  }
  
}

三、判断以邻接表方式存储的有向图中是否存在由顶点vi到vj的路径

int visited[Max]={0};
int judgeitoj(ALGraph g, int i,int j){
  if(i==j){
    return 1
  }
  visited[i]=1;
  ArcNode p=g.vertices[i].first;
  while(p){
    if(!visited[p->adjvex]){
      return judgeitoj(g,p->adjvex,j);
    }
    p=p->next;
  }  
  return 0;
}

四、按图的宽度优先搜索法写一算法,判别以邻接矩阵存储的有向图中是否存在由顶点vi到顶点vj的路径

int judgeitoj(MGraph g, int i,int j){
  int Queue[Max],front=-1,rear=0;
  Queue[0]=i;
  while(front<rear){
    int u=Queue[++front];
    for(int k=0;k<g.vexnum;k++){
      if(g.Edge[u][k]==1&&k==j){
        return 1;
      }
      if(g.Edge[u][k]==1&&!visited[k]){
        visited[k]=1;
        Queue[++rear]=k;
      }
    }
  }
  return 0;
}

五、假设以邻接矩阵作为图的存储结构,编写算法,判定在给定的有向图中是否存在一个简单有向回路,若存在,则以顶点序列的方式输出该回路

int Topsort(MGraph g){
  int Stack[Max],top=-1;
  int num=0;
  for(int i=0;i<g.vexnum;i++){
    if(indegree[i]==0){
      Stack[++top]=i;
    }
  }
  while(top!=-1){
    num++;
    int p=Stack[top--];
    for(int i=0;i<g.vexnum;i++){
      if(g.Edge[p][i]!=0){
        indegree[i]--;
        if(indegree[i]==0){
          Stack[++top]=i;
        }
      }
    }
  }
  if(num==g.vexnum){
    return 1;
  }else{
     return 0;
  }
 
}

六、编写程序,判断一个用邻接表存储的有向图是否存在回路

int Topsort(ALGraph g){
  int Stack[Max],top=-1,num=0;
  for(int i=0;i<g.vexnum;i++){
    if(indegree[i]==0){
      Stack[++top]=i;
    }
  }
  while(top!=-1){
    num++;
    int j=Stack[++top];
    ArcNode p=g.vertices[j].first;
    while(p){
      int u=p->adjvex;
      indegree[u]--;
      if(indegree[u]==0){
        Stack[++top]=u;
      }
      p=p->next;
    }
  }
  if(num==g.vexnum){
    return 1;
  }else{
    return 0;
  }
}

七、在有向图G中,如果r到G中的每个结点都有路径可达,则称结点r为G的根节点,判断有向图G是否有根

void dfs(ALGraph g,int v){
  visited[v]=1;
  num++;
  if(num==g.vexnum){
    printf(v);
    num=0;
  }else{
    ArcNode p=g.vertices[v].first;
    while(p){
      int j=p->adjvex;
      if(!visited[j]) dfs(g,j);
      p=p->next;
    }
    num--;
    visited[v]=0;
  }
}
void rootnode(ALGraph g){
  for(int i=0;i<g.vexnum;i++){
    if(!visited[i]){
      dfs(g,i);
    }
  }
}

八、设无向图G用邻接表存储,试用宽度优先遍历写出求出图G中各联通分量个数的算法

int rootnode(ALGraph g){
  int num=0;
  for(int i=0;i<g.vexnum;i++){
    if(!visited[i]){
      bfs(g,i);
      num++;
    }
  }
  return num;
}
 void bfs(ALGraph g,int v){
  int Queue[Max],front=-1,rear=0;
  Queue[0]=v;
  while(front<rear){
    v=Queue[++front];
    visited[v]=1;
    ArcNode p=g.vertices[v].first;
    while (p)
    {
      int j=p->adjvex;
      if(!visited[j]){
        Queue[++rear]=v;
      }
      p=p->next;
    }
  }
 }

九、设计算法以判断给定的无向图G中是否存在一条以v0为起点的包含所有顶点的简单路径

int num=0,path[Max];
void dfs(ALGraph g,int v){
   visited[v]=1;
   path[num++]=v;
   if(num==g.vexnum){
    for(int i=0;i<g.vexnum;i++){
      printf(path[i]);
    }
   }else{
   ArcNode p=g.vertices[v].first;
   while(p){
      int j=p->adjvex;
      if(!visited[j]){
        dfs(g,j);
      }
      p=p->next;
    }
   }
}

十、已有邻接表表示的有向图,请编程判断从顶点u至顶点v是否有简单路径,若有则打印出该路径上所有顶点

void dfs(ALGraph g,int u,int v){
   visited[v]=1;
   int Stack[Max],top=-1;
   Stack[++top]=u;
   while(top!=-1){
    ArcNode p=g.vertices[v].first;
    while(p&&visited[p->adjvex]){
      p=p->next;
    }
    if(!p)top--;
    else{
      int j=p->adjvex;
      if(j==v){
        for(int i=0;i<top;i++){
          printf(Stack[i]);
        }
      }else{
        visited[j]=1;
        Stack[++top]=j;
      }
    }
  }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值