《数据结构与算法A》实验5:图的基本操作的实现

《数据结构与算法A》实验5:图的基本操作的实现


Description


掌握图的两种表示方法:

(1)邻接矩阵表示法;

(2)邻接表表示法。

在本实验中,无向图采用邻接矩阵表示,有向图采用邻接表表示。

实现图的如下基本操作:统计图中每个顶点的度数。说明:有向图中顶点度数为该顶点入度和出度之和。

Input


本题目包含多组测试数据。

输入数据的第一行是一个正整数Y(Y=1表示接下来输入的图是无向图,Y=2表示接下来输入的图是有向图,当Y取其他值时,表示输入结束)。

第二行包含两个正整数N和M(1<N<20,0<M<100),分别代表图中顶点和边(或者弧)的数目。

接下来输入M行数据,每一行有两个以空格间隔的整数a和b(0≤a,b≤N-1),表示顶点a与顶点b之间有一条边(或者弧)。

例如输入:

1 —无向图

4 3 —4个顶点,3条边

0 1 —第1条边的信息

0 2 —第2条边的信息

1 2 —第3条边的信息

例如输入:

2 —有向图

5 4 —5个顶点,4条弧

0 2 —第1条弧的信息,顶点0为起点,顶点2为终点

2 1 —第2条弧的信息,顶点2为起点,顶点1为终点

1 2 —第3条弧的信息,顶点1为起点,顶点2为终点

3 4 —第4条弧的信息,顶点3为起点,顶点4为终点

Output


对每个图,按其顶点编号从小到大的次序,依次输出每个顶点编号及该顶点的度(以空格间隔),每个顶点的相关信息占一行。

例如对于上面的无向图,其输出如下:

0 2

1 2

2 2

3 0

Sample Input


1
4 3
0 1
0 2
1 2
2
5 8
0 1
0 3
1 0
1 2
1 3
2 1
4 1
4 2
-1

Sample Output


0 2
1 2
2 2
3 0
0 3
1 6
2 3
3 2
4 2

代码


#include<iostream>
 
int Max = 1 << 30;
 
int n, m;
 
using namespace std;
 
class Undirected_graph 
{
private:
    int num;
 
    int *node;
 
    int **map;
public:
    Undirected_graph();
 
    ~Undirected_graph();
 
    void init();
 
    void show();
};
 
Undirected_graph::Undirected_graph()
{
    num = n;
 
    node = new int[num + 1];
 
    map = new int*[num + 1];
 
    for (int i = 0; i < num + 1; i++)
    {
        map[i] = new int[num + 1];
    }
 
    for (int i = 0; i < num + 1; i++)
    {
        node[i] = 0;
 
        for (int j = 0; j < num + 1; j++)
        {
            if (i == j) map[i][j] = 0;
 
            else map[i][j] = Max;
        }
    }
}
 
Undirected_graph::~Undirected_graph()
{
    delete[]node;
 
    for (int i = 0; i < num + 1; i++)
    {
        delete[] map[i];
    }
    delete[] map;
}
 
void Undirected_graph::init()
{
 
    for (int i = 0; i < m; i++)
    {
        int j, k;
 
        cin >> j >> k;
 
        if (map[j][k] != 1)
        {
            node[j]++;
 
            node[k]++;
        }
 
        map[j][k] = map[k][j] = 1;
    }
}
 
void Undirected_graph::show()
{
    for (int i = 0; i < num; i++)
        cout << i << ' ' << node[i] << endl;
}
 
class Node
{
private:
    int id;
 
    Node *next;
public:
    Node(int = -1);
 
    friend class Nlink;
};
 
Node::Node(int id)
{
    this->id = id;
    next = NULL;
}
 
class Nlink
{
private:
    int id;
 
    int degree;
 
    Node *head;
public:
    Nlink(int = -1);
 
    ~Nlink();
 
    void addNode(int);
 
    friend class Digraph;
};
 
Nlink::Nlink(int id)
{
    degree = 0;
    head = NULL;
}
 
Nlink::~Nlink()
{
    degree = 0;
 
    delete head;
 
    head = NULL;
}
 
void Nlink::addNode(int num)
{
    Node *n = new Node(num);
 
    if (head == NULL)
    {
        head = n;
        return;
    }
 
    Node *p = head;
 
    while (p->next)
    {
        p = p->next;
    }
 
    p->next = n;
 
    degree++;
}
 
class Digraph {
private:
    int num;
 
    Nlink *map;
public:
    Digraph();
 
    void init();
 
    void show();
};
 
Digraph::Digraph()
{
    num = n;
 
    map = new Nlink[num + 1];
 
    for (int i = 0; i < num + 1; i++)
    {
        map[i].id = i;
 
        map[i].addNode(i);
    }
}
 
void Digraph::init()
{
    for (int i = 0; i < m; i++)
    {
        int j, k;
 
        cin >> j >> k;
 
        map[j].addNode(k);
         
        map[k].degree++;
    }
}
 
void Digraph::show()
{
    for (int i = 0; i < num; i++)
    {
        cout << map[i].id << ' ' << map[i].degree << endl;
    }
}
 
int main()
{
    int flag;
 
    while (cin >> flag)
    {
        if (flag == 1)
        {
            cin >> n >> m;
            Undirected_graph ug;
            ug.init();
            ug.show();
        }
        else if (flag == 2)
        {
            cin >> n >> m;
            Digraph dg;
            dg.init();
            dg.show();
        }
        else break;
    }
}
  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值