7-201 列出连通集 (25 分)

简介: 7-201 列出连通集 (25 分)

7-201 列出连通集 (25 分)


给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集。假设顶点从0到N−1编号。进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点。


输入格式:


输入第1行给出2个整数N(0<N≤10)和E,分别是图的顶点数和边数。随后E行,每行给出一条边的两个端点。每行中的数字之间用1空格分隔。


输出格式:


按照"{ v1 v2 ... vk }"的格式,每行输出一个连通集。先输出DFS的结果,再输出BFS的结果。


输入样例:


8 6
0 7
0 1
2 0
4 1
2 4
3 5


结尾无空行


输出样例:


{ 0 1 4 2 7 }
{ 3 5 }
{ 6 }
{ 0 1 2 7 4 }
{ 3 5 }
{ 6 }


结尾无空行


#include<iostream>
#include<queue>
using namespace std;
const int maxn = 15; 
int G[maxn][maxn], vis[maxn];
int n, k;
void dfs(int step) {
  for(int i = 0; i < n; i++) 
    if(!vis[i] && G[step][i]) {
      vis[i] = 1;
      cout << ' ' << i;
      dfs(i);
    }
}
void bfs(int step) {
  queue<int>q;
  q.push(step);
  while(!q.empty()) {
    int x = q.front(); q.pop();
    for(int i = 0; i < n; i++) 
      if(!vis[i] && G[x][i]) {
        vis[i] = 1;
        cout << ' ' << i;
        q.push(i);
      }
  }
} 
int main() {
  cin >> n >> k;
  //DFS部分 
    //赋值 
  for(int i = 0; i < k; i++) {
    int x, y; cin >> x >> y;
    G[x][y] = G[y][x] = 1;
  }
    //遍历 
  for(int i = 0; i < n; i++) {
    if(vis[i] == 0) {
      vis[i] = 1;
      cout << "{ " << i;
      dfs(i); 
      cout << " }\n";
    }
  }
  //bfs部分 
  //初始化
  memset(vis, 0, sizeof(vis));
  for(int i = 0; i < n; i++) {
    if(vis[i] == 0) {
      vis[i] = 1;
      cout << "{ " << i;
      bfs(i);
      cout << " }\n";
    }
  } 
  return 0;
}


#include <stdio.h>
#include <stdlib.h>
#define MaxVertexNum 10
int Visited[MaxVertexNum];
int N;
typedef int Vertex; /* 用顶点下标表示顶点,为整型 */
/*边的定义*/
typedef struct ENode *Edge;
struct ENode{
    Vertex V1,V2;
};
/*邻接点的定义*/
typedef struct AdjNode *PtrToAdjNode;
struct AdjNode{
    Vertex AdjV;
    PtrToAdjNode Next;
};
/*邻接表头结点定义*/
typedef struct VNode{
    PtrToAdjNode FirstEdge;
}AdjList[MaxVertexNum];
/*图结点的定义*/
typedef struct GNode *LGraph;
struct GNode{
    int Nv,Ne;
    AdjList G;
};
typedef struct QueueNode *Queue;
struct QueueNode{
    int Front,Rear;
    Vertex *Elements;
};
LGraph CreatGraph(int VexterNum);
void InsertEdge(LGraph Graph,Edge E);
LGraph BuildGraph();
void DFS(LGraph Graph,Vertex V,void (*Visit)(Vertex));
void BFS(LGraph Graph,Vertex S,void (*Visit)(Vertex));
Queue CreatQuene(int MaxSize);
void AddQ(Queue Q,Vertex V);
Vertex DeleteQ(Queue Q);
int IsEmpty(Queue Q);
void Visit(Vertex V);
int main()
{
    Vertex V;
    LGraph Graph = BuildGraph();
    for(V=0;V<MaxVertexNum;V++) Visited[V] = 0;
    for(V=0;V<N;V++)
    {
        if(!Visited[V])
        {
            printf("{ ");
            DFS(Graph,V,Visit);
            printf("}\n");
        }
    }
    for(V=0;V<MaxVertexNum;V++) Visited[V] = 0;
    for(V=0;V<N;V++)
    {
        if(!Visited[V])
        {
            printf("{ ");
            BFS(Graph,V,Visit);
            printf("}\n");
        }
    }
    return 0;
}
LGraph CreatGraph(int VexterNum)
{/* 初始化一个有VertexNum个顶点但没有边的图 */
    LGraph Graph;
    Graph = (LGraph)malloc(sizeof(struct GNode));
    Graph->Ne = 0;
    Graph->Nv = VexterNum;
    for(int V=0;V<Graph->Nv;V++)
    {
        Graph->G[V].FirstEdge = NULL;
    }
    return Graph;
}
void InsertEdge(LGraph Graph,Edge E)
{
    PtrToAdjNode NewNode,W;
    /* 插入边 <V1, V2> ,在V1为下标的链表中,插入结点V2,表示v1->v2*/
    NewNode = (PtrToAdjNode)malloc(sizeof(struct AdjNode));
    NewNode->AdjV = E->V2;
    /*remark:注意题目要求是按照编号递增的顺序访问邻接点,
    所以邻接表插入新结点的时候要注意按照下标从小到大插入;
    这部分用邻接矩阵存储的话会比较简便*/
    if(!Graph->G[E->V1].FirstEdge)
    {
        NewNode->Next = Graph->G[E->V1].FirstEdge;
        Graph->G[E->V1].FirstEdge = NewNode;
    }
    else if(Graph->G[E->V1].FirstEdge&&!Graph->G[E->V1].FirstEdge->Next)
    {
        if(NewNode->AdjV < Graph->G[E->V1].FirstEdge->AdjV)
        {
            NewNode->Next = Graph->G[E->V1].FirstEdge;
            Graph->G[E->V1].FirstEdge = NewNode;
        }else{
            NewNode->Next = Graph->G[E->V1].FirstEdge->Next;
            Graph->G[E->V1].FirstEdge->Next = NewNode;
        }
    }
    else{
        for(W = Graph->G[E->V1].FirstEdge;W;W=W->Next)
        {
            if(!W->Next||(W->Next->AdjV > NewNode->AdjV))
            {
                NewNode->Next = W->Next;
                W->Next = NewNode;
                break;
            }
        }
    }
}
LGraph BuildGraph()
{
    Edge E1,E2;
    scanf("%d",&N);
    LGraph Graph = CreatGraph(N);
    scanf("%d",&Graph->Ne);
    E1 = (Edge)malloc(sizeof(struct ENode));
    E2 = (Edge)malloc(sizeof(struct ENode));
    for(int i=0;i<Graph->Ne;i++)
    {
        scanf("%d %d",&E1->V1,&E1->V2);
        InsertEdge(Graph,E1);
        E2->V1 = E1->V2;
        E2->V2 = E1->V1;
        InsertEdge(Graph,E2);
    }
    return Graph;
}
void Visit(Vertex V)
{
    printf("%d ",V);
}
void DFS(LGraph Graph,Vertex V,void (*Visit)(Vertex))
{
    PtrToAdjNode W;
    Visit(V);
    Visited[V] = 1;
    for(W = Graph->G[V].FirstEdge;W;W = W->Next)
    {
        if(!Visited[W->AdjV])
            DFS(Graph,W->AdjV,Visit);
    }
}
void BFS(LGraph Graph,Vertex S,void (*Visit)(Vertex))
{
    Vertex V;
    PtrToAdjNode W;
    Queue Q = CreatQuene(MaxVertexNum);
    Visit(S);
    Visited[S] = 1;
    AddQ(Q,S);
    while(!IsEmpty(Q))
    {
        V = DeleteQ(Q);
        for(W = Graph->G[V].FirstEdge;W;W = W->Next)
        {
            if(!Visited[W->AdjV])
            {
                Visit(W->AdjV);
                Visited[W->AdjV] = 1;
                AddQ(Q,W->AdjV);
            }
        }
    }
}
Queue CreatQuene(int MaxSize)
{
    Queue Q = (Queue)malloc(sizeof(struct QueueNode));
    Q->Elements = (int *)malloc(sizeof(int)*MaxSize);
    Q->Front = Q->Rear = 0;
    return Q;
}
void AddQ(Queue Q,Vertex V)
{
    Q->Elements[Q->Rear++] = V;
}
Vertex DeleteQ(Queue Q)
{
    return Q->Elements[Q->Front++];
}
int IsEmpty(Queue Q)
{
    return Q->Front==Q->Rear;
}
目录
相关文章
|
3天前
【每日一题Day243】LC1595连通两组点的最小成本 | 状态压缩dp
【每日一题Day243】LC1595连通两组点的最小成本 | 状态压缩dp
29 0
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(二)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
|
3天前
|
算法 测试技术 C#
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(三)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
|
3天前
|
人工智能 BI 测试技术
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目(一)
【树上倍增】【割点】 【换根法】3067. 在带权树网络中统计可连接服务器对数目
|
3天前
leetcode-1319:连通网络的操作次数
leetcode-1319:连通网络的操作次数
19 0
|
9月前
|
算法 C++
探索最小生成树:连通世界的最短纽带
生活中,我们常常需要在一组地点之间建立联系,这些联系可能是道路、管道、电缆等。然而,资源有限,成本宝贵。在这种情况下,如何以最小的代价将这些地点连接起来,成为了一个关键问题。这就引出了图论中的一个重要概念:最小生成树(Minimum Spanning Tree,MST)。本文将通过一个日常生活的案例,详细探讨最小生成树的概念、应用。
53 0
|
3天前
【每日一题Day311】LC1761一个图中连通三元组的最小度数 | 枚举
【每日一题Day311】LC1761一个图中连通三元组的最小度数 | 枚举
24 0
|
11月前
|
vr&ar
离散数学_十章-图 ( 5 ):连通性 - 下
离散数学_十章-图 ( 5 ):连通性 - 下
113 0
|
11月前
离散数学_十章-图 ( 5 ):连通性 - 上
离散数学_十章-图 ( 5 ):连通性 - 上
94 0
LeetCode 1791. 找出星型图的中心节点
有一个无向的 星型 图,由 n 个编号从 1 到 n 的节点组成。星型图有一个 中心 节点,并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。
72 0