zoukankan      html  css  js  c++  java
  • 列出连通集

    06-图1 列出连通集(25 分)

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

    输入格式:

    输入第1行给出2个整数N(0<N10)和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 }
     1 #include<iostream>
     2 #include<vector>
     3 #include<queue>
     4 using namespace std;
     5 #define maxvertexnum 10 
     6 #define weighttype int
     7 #define datatype string
     8 #define vertex int
     9 struct graph{
    10 int Nv;//定点数 
    11 int Ne;//边数
    12 weighttype G[maxvertexnum][maxvertexnum];
    13 datatype data[maxvertexnum];
    14 };
    15 using Graph=graph*;
    16 vector<int> visited(maxvertexnum,0);
    17 queue<int> q;
    18 struct Enode{
    19 vertex v1,v2;
    20 weighttype weight;
    21 };
    22 using edge=Enode*;
    23 Graph creategraph(int vertexnum){
    24 int w,v; Graph gra=new graph();
    25 gra->Nv=vertexnum;
    26 gra->Ne=0;
    27 for(v=0;v<gra->Nv;v++)
    28 for(w=0;w<gra->Nv;w++)
    29 gra->G[v][w]=0;
    30 return gra;
    31 }
    32 void Insert(Graph gra,edge e){
    33 gra->G[e->v1][e->v2]=1;
    34 gra->G[e->v2][e->v1]=1;
    35 }
    36 Graph buildgraph(){
    37 Graph gra; edge e; vertex v;int Nv,i;
    38 cin>>Nv;
    39 gra=creategraph(Nv);
    40 cin>>gra->Ne;
    41 if(gra->Ne){
    42 e=new Enode();
    43 for(i=0;i<gra->Ne;i++){
    44 cin>>e->v1>>e->v2;
    45     Insert(gra,e);} 
    46 }
    47    //for(v=0;v<gra->Nv;v++)
    48    //cin>>gra->data[v];
    49    return gra;
    50 }
    51 void DFS(Graph gra,vertex v)
    52 {   vertex v1;
    53 cout<<v<<" "; visited[v]=1;
    54 for(v1=0;v1<gra->Nv;v1++)
    55 if(gra->G[v][v1]==1&&visited[v1]!=1)
    56 DFS(gra,v1);
    57 }
    58 void BFS(Graph gra)
    59 {   vertex v1,v2;
    60 if(q.size()!=0){ 
    61     v1=q.front();
    62 q.pop();
    63 if(visited[v1]!=1){cout<<v1<<" "; visited[v1]=1;}
    64 for(v2=0;v2<gra->Nv;v2++){
    65 if(visited[v2]!=1&&gra->G[v1][v2]==1)
    66 q.push(v2);}
    67 BFS(gra);}  
    68 }
    69 void DFSLOOK(Graph gra){
    70 vertex v;
    71 for(v=0;v<gra->Nv;v++){
    72 if(visited[v]!=1){
    73 cout<<"{ ";  DFS(gra,v); cout<<"}"<<endl;
    74 }
    75 }
    76 for(auto &o:visited)
    77 o=0;
    78 }
    79 void BFSLOOK(Graph gra){
    80 vertex v;
    81 for(v=0;v<gra->Nv;v++){
    82 if(visited[v]!=1){
    83 cout<<"{ ";  q.push(v); BFS(gra); cout<<"}"<<endl;
    84 }
    85 }
    86     for(auto &o:visited)
    87 o=0; 
    88 }
    89 int main(){
    90 Graph gra=buildgraph();
    91 //for(int i=0;i<gra->Nv;i++)
    92 //for(int j=0;j<gra->Nv;j++)
    93 //cout<<gra->G[i][j]<<" "<<endl;
    94 DFSLOOK(gra);
    95 BFSLOOK(gra);
    96 return 0;
    97 }
    View Code
     
  • 相关阅读:
    JavaStript基础 —— JavaStript语法
    JS拖动滑块验证
    解释型语言和编译型语言、弱类型语言和强类型语言、动态语言和静态语言的区别
    user-select 用户禁止选中
    短地址
    JS实现 Tab栏切换案例
    setAttribute()方法和 getAttribute() 方法
    JS 全局作用域和局部作用域
    数组遍历 forEach 方法
    十进制小数转换为二进制
  • 原文地址:https://www.cnblogs.com/A-Little-Nut/p/8056102.html
Copyright © 2011-2022 走看看