图论基础之有向图出入度的计算

马上就开始去老校区进行数模培训了,听韩老师说,美赛很多题都是图论和网络流,于是打算近期恶补图论的相关知识了.

题目是说,对于一个有向图,请用邻接矩阵存储并且输出各个顶点的出度和入度.


解题思路:

这题写出来就是为了好好学习下邻接矩阵的写法,毕竟邻接矩阵也是后续学习图论内容非常重要的一个知识环节.

什么是了邻接矩阵呢?邻接矩阵说的就是对于一个图,把他的所有顶点都抽象出来成为V,把顶点与顶点间的关系抽象出来成为E,

那么不同顶点间肯定会存在边的关系,于是这样,我们就能把这样的一个图通过二维矩阵来描述出来了,如果Edge[i][j]=1,表示这两个顶点之间有边相互连接,

如果表示为0,表示这两个顶点之间没有边相互连接,好了,介绍完邻接矩阵后,再来看看顶点的出入度怎么求解了,我们知道,一个顶点的出入度可以分别从邻接矩阵中读出来了,究竟这个该怎么读呢?我们这样想,把第i个顶点的这一行的值加起来,就对这应了该顶点的出度,把第i个顶点的这一列的值加起来就对应了这个顶点的入度,那么这样一看的话,我们就能够很容易的计算出一个顶点的入度和出度了..



代码:

# include<cstdio>
# include<iostream>
# include<cstring>

using namespace std;

# define MAX 100

int Edge[MAX][MAX];

int main(void)
{
    int n,m;//顶点和边数
    while ( cin>>n>>m )
    {
        int u,v;//边的起点和终点
        int od,id;//顶点的入度和出度
        if ( n == 0 && m == 0 )
            {
                break;
            }
            memset( Edge,0,sizeof(Edge) );
            for ( int i = 1;i <= m;i++ )
                {
                    cin>>u>>v;
                    Edge[u-1][v-1] = 1;
                }
                for ( int i = 0;i < n;i++ )
                    {
                        od = 0;
                        for ( int j = 0;j < m;j++ )
                            {
                                od += Edge[i][j];
                            }
                        if ( i==0 )
                            cout<<od;
                            else
                                cout<<" "<<od;

                    }
                    cout<<endl;

                    for ( int i = 0;i < n;i++ )
                        {
                            id = 0;
                            for ( int j = 0;j < n;j++ )
                                {
                                    id += Edge[j][i];
                                }
                                if ( i == 0 )
                                    cout<<id;
                                    else
                                        cout<<" "<<id;
                        }
                        cout<<endl;

    }

    return 0;
}


  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值