12-B. DS图—图的连通分量

连通图分析:算法实现与连通分量计数

12-图连通与最小生成树-
题目描述
输入无向图顶点信息和边信息,创建图的邻接矩阵存储结构,计算图的连通分量个数。

输入
测试次数t

每组测试数据格式如下:

第一行:顶点数 顶点信息

第二行:边数

第三行开始,每行一条边信息

输出
每组测试数据输出,顶点信息和邻接矩阵信息

输出图的连通分量个数,具体输出格式见样例。

每组输出直接用空行分隔。

输入样例
3
4 A B C D
2
A B
A C
6 V1 V2 V3 V4 V5 V6
5
V1 V2
V1 V3
V2 V4
V5 V6
V3 V5
8 1 2 3 4 5 6 7 8
5
1 2
1 3
5 6
5 7
4 8

输出样例
A B C D
0 1 1 0
1 0 0 0
1 0 0 0
0 0 0 0
2

V1 V2 V3 V4 V5 V6
0 1 1 0 0 0
1 0 0 1 0 0
1 0 0 0 1 0
0 1 0 0 0 0
0 0 1 0 0 1
0 0 0 0 1 0
1

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

#include<iostream>
using namespace std;

class Map
{
    private:
         int **mat;//邻接矩阵
         int n;
         int sum=0;
         bool visit[20];
         char **vertex;//顶点名字
         
    public:
        void set(int num)
        {
            int i,j;
            n=num;

            mat=new int *[n];
            vertex=new char *[n];
            for(i=0;i<n;i++)//初始化
            {
                vertex[i]=new char[10];
                mat[i]=new int[n];
                
                for(j=0;j<n;j++)
                    mat[i][j]=0;
                    
                for(j=0;j<10;j++)
                    vertex[i][j]=0;
            }
            
            for(i=0;i<n;i++)
                cin>>vertex[i];
                
            int s;//边数
            cin>>s;
            while(s--)
            {
                uinsert();
            }
        }
    
        int find(char *a)
        {
            int i,j,flag;
            
            for(i=0;i<n;i++)
            {
                flag=1;
                for(j=0;j<10;j++)
                {
                    if(vertex[i][j]!=a[j])
                    {
                        flag=0;
                        break;
                    }
                }
                if(flag==1)
                    return i;
            }
            return 0;
        }
    
        void uinsert()//无向图
        {
            char a[10]={0},b[10]={0};
            cin>>a>>b;
            int x,y;
            x=find(a);y=find(b);
            
            mat[x][y]=1;//邻接矩阵图
            mat[y][x]=1;
        }
        
        void finddfs()
        {
            int i;
            for(i=0;i<n;i++)//初始化
                visit[i]=false;
            
            for(i=0;i<n;i++)
            {
                if(!visit[i])
                {
                    dfs(i);
                    sum++;
                }
            }
        }
        
        void dfs(int p)//深度搜索
        {
            int i;
            visit[p]=true;//设置已访问
            int *a=new int[n];
            int pos=0;
            
            for(i=0;i<n;i++)
            {
                if(mat[p][i])
                    a[pos++]=i;
            }
                    
            for(i=0;i<pos;i++)
                if(!visit[a[i]])
                    dfs(a[i]);
                    
            delete []a;
        }
        
        void print()//输出
        {
            int i,j;
            
            for(i=0;i<n;i++)//顶点信息
            {
                if(i==0)
                cout<<vertex[i];
                else
                cout<<" "<<vertex[i];
            }
            cout<<endl;
            
            for(i=0;i<n;i++)
            {
                for(j=0;j<n;j++)
                {
                    if(j==n-1)
                        cout<<mat[i][j];
                    else
                        cout<<mat[i][j]<<" ";
                }
                cout<<endl;
            }
            cout<<sum<<endl<<endl;
        }
};

int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        Map M;
        M.set(n);
        M.finddfs();
        M.print();
    }
    return 0;
}

下列关于无向连通特征的叙述中,正确的是: 所有顶点的度之和为偶数 边数大于顶点个数减1 至少有一个顶点的度为1 A. 只有1 B. 只有2 C. 1和2 D. 1和3 分数 3 作者 DS课程组 单位 浙江大学 如果G是一个有28条边的非连通无向,那么该顶点个数最少为多少? A. 7 B. 8 C. 9 D. 10 分数 3 作者 DS课程组 单位 浙江大学 对于给定的有权无向G,下列哪个说法是正确的? A. G的最小生成树中,任意一对顶点间的路径必是它们在G中的最短路径 B. 设顶点V到W的最短路径为P。若我们将G中每条边的权重都加1,则P一定仍然是V到W的最短路径 C. 单源最短路问题可以用O(∣E∣+∣V∣)的时间解决 D. 以上都不对 分数 3 作者 DS课程组 单位 浙江大学 下列有关的叙述中,有几句是对的? 如果e是有权无向G唯一的一条最短边,那么边e一定会在该的最小生成树上。 如果无向的宽度优先搜索的结果为1234....,且顶点1与顶点4之间存在一条边相连,那么顶点1与顶点3之间也一定有边相连。 如果从有向G(至少有2个顶点)的每一点均能通过深度优先搜索遍历到所有其它顶点,那么该一定不存在拓扑序列。 若采用接矩阵表示,如果该矩阵不全为0,且矩阵主对角线以下全是0,那么说明该一定是有向。 A. 4句 B. 3句 C. 2句 D. 1句 分数 3 作者 陈越 单位 浙江大学 如果G是一个15条边的非连通无向,那么该顶点个数最少为多少? A. 7 B. 8 C. 9 D. 10 分数 3 作者 陈越 单位 浙江大学 给定一个有向接表如下,则该有__个强连通分量。 A. 4 {{0, 1, 5}, {2}, {3}, {4}} B. 3 {{2}, {4}, {0, 1, 3, 5}} C. 1 {0, 1, 2, 3, 4, 5} D. 1 {0, 5, 1, 3} 分数 3 作者 陈越 单位 浙江大学 给定有权无向如下。关于其最小生成树,下列哪句是对的? A. 边(B, A)一定在树中,树的总权重为23 B. 边(D, C)一定在树中,树的总权重为20 C. 最小生成树不唯一,其总权重为23 D. 最小生成树唯一,其总权重为20 分数 2 作者 严冰 单位 浙大城市学院 设有向的顶点个数为n,则该最多可以有()条弧。 A. n-1 B. n(n-1)/2 C. n(n-1) D. n2 分数 2 作者 严冰 单位 浙大城市学院 具有6个顶点的无向至少应有()条边才能确保是一个连通。 A. 5 B. 6 C. 7 D. 8 分数 2 作者 严冰 单位 浙大城市学院 下列中其接矩阵是对称矩阵的是()。 A. 有向 B. 无向 C. AOV D. AOE 分数 2 作者 严冰 单位 浙大城市学院 任何一个无向连通的最小生成树()。 A. 一定有多棵 B. 可能不存在 C. 有一棵或多棵 D. 只有一棵 分数 2 作者 严冰 单位 浙大城市学院 的BFS生成树的树高比DFS生成树的树高()。 A. 小 B. 小或相等 C. 大或相等 D. 大 分数 2 作者 严冰 单位 浙大城市学院 连通的极小连通称为该的()。 A. 关键路径 B. 生成树 C. 回路 D. 最小回路 分数 2 作者 严冰 单位 浙大城市学院 有拓扑排序的一定是()。 A. 无向 B. 有向无环 C. 有环 D.连通 分数 2 作者 孟繁军 单位 浙江大学 下列关于无向连通特性的叙述中,正确的是 I.所有顶点的度之和为偶数 II.边数大于等于顶点个数减1 III.至少有一个顶点的度为1 。 A. 只有I B. 只有II C. I和II D. I和III
最新发布
11-21
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值