首页 > 其他 > 详细

DS图—图的连通分量

时间:2020-01-11 21:41:17      阅读:101      评论:0      收藏:0      [点我收藏+]

题目描述

输入无向图顶点信息和边信息,创建图的邻接矩阵存储结构,计算图的连通分量个数。

输入

测试次数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>
#include<string>
using namespace std;
#define Maxlen 40
void DFS(int n,int v,bool *visit,int m[100][100]);
int DFSmove(int n,bool *visit,int m[100][100])
{
    int Count=0;
    for(int i=0;i<Maxlen;i++)
    {
        visit[i]=false;
    }
    for(int i=0;i<n;i++)
    {
        if(visit[i]==false)
        {
            Count++;
            DFS(n,i,visit,m);
        }
    }
    return Count;
}
void DFS(int n,int v,bool *visit,int m[100][100])
{
    visit[v]=true;
    int *temp=new int[n];///找到与v相连的结点
    for(int i=0;i<n;i++)
        temp[i]=-1;
    int k=0;
    for(int i=0;i<n;i++)
    {
        if(m[v][i]==1)
        {
            temp[k]=i;
            k++;
        }
    }
    int w;
    int i=0;
    for(w=temp[i];w>=0;i++,w=temp[i])
    {
        if(visit[w]==false)
            DFS(n,w,visit,m);
    }
    delete []temp;
}
int main()
{
    int T;
    cin>>T;
    while(T--)
    {
        int pn;
        cin>>pn;
        string *p=new string[pn];
        for(int i=0;i<pn;i++)
            cin>>p[i];
        int ln;
        cin>>ln;
        int m[100][100];
        for(int i=0;i<pn;i++)
            for(int j=0;j<pn;j++)
                m[i][j]=0;
        int flag1,flag2;
        string p1,p2;
        for(int i=0;i<ln;i++)
        {
            cin>>p1>>p2;
            for(int j=0;j<pn;j++)
            {
                if(p[j]==p1)
                {
                    flag1=j;
                }
                if(p[j]==p2)
                {
                    flag2=j;
                }
            }
            m[flag1][flag2]=1;
            m[flag2][flag1]=1;
 
        }
        for(int i=0;i<pn;i++)
        {
            if(i!=pn-1)
                cout<<p[i]<<" ";
            else
                cout<<p[i]<<endl;
        }
        for(int i=0;i<pn;i++)
        {
            for(int j=0;j<pn;j++)
            {
                if(j==pn-1)
                    cout<<m[i][j];
                else
                    cout<<m[i][j]<<" ";
            }
            cout<<endl;
        }
        int n=pn;
        bool visit[Maxlen];
        cout<<DFSmove(n,visit,m)<<endl;
        if(T)
            cout<<endl;
        delete []p;
    }
    return 0;
}

DS图—图的连通分量

原文:https://www.cnblogs.com/SZU-DS-wys/p/12180937.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!