图的建立相关学习

图论再竞赛中有很多的用处,也很好用,在这里进行图的结点的建立进行初步的介绍。

再图的建立里面,有两种基础主要的建立方式:

1、邻接矩阵

2、邻接表

上面是很基础,必须了解的方法,其中邻接表更加需要进行理解清楚,因为更常用且好用。

先来介绍邻接矩阵,这也是需要理解的,这个再某些时候更方便。

1、邻接矩阵

邻接矩阵就是用二维数组来进行存储边之间的关系,这是很好理解的,但是再n很大或者是稀疏图的时候是很浪费时空的。

建立方法就是建立二维数组,来进行直接存储。

再这个二维矩阵中,将其内容存储为你需要存储的,其实可以存储0或无限大,为0时可以表示无权图,无限大为两点无连接,为有权图常用的,就是当i到j有一边时,将[i][j]存为1,有权值时就存为权值。

/**
无向图、无权值
**/
const int maxn = 1e4 ;
int a[maxn][maxn] ;
int x , y ;///为连接边
for(int i = 1 ; i <= n ; i ++)
{
    for(int j = 1 ; j <= n ; j ++)
    {
        scanf("%d%d" , &x , &y) ;
        a[x][y] = a[y][x] = 1 ;
    }
}

/**
无向图、有权值
**/
const int maxn = 1e4 ;
int a[maxn][maxn] ;
int x , y , w ;///x , y为连接边,w为权值
for(int i = 1 ; i <= n ; i ++)
{
    for(int j = 1 ; j <= n ; j ++)
    {
        scanf("%d%d%d" , &x , &y , &w) ;
        a[x][y] = a[y][x] = w ;
    }
}

/**
有向图、无权值
**/
const int maxn = 1e4 ;
int a[maxn][maxn] ;
int x , y ;///为连接边
for(int i = 1 ; i <= n ; i ++)
{
    for(int j = 1 ; j <= n ; j ++)
    {
        scanf("%d%d" , &x , &y) ;
        a[x][y] = 1 ;
    }
}

/**
有向图、有权值
**/
const int maxn = 1e4 ;
int a[maxn][maxn] ;
int x , y  , w ;///x , y为连接边,w为权值
for(int i = 1 ; i <= n ; i ++)
{
    for(int j = 1 ; j <= n ; j ++)
    {
        scanf("%d%d%d" , &x , &y , &w) ;
        a[x][y] = w ;
    }
}

最好n最大值设置在1e4,不然当心超出存储的空间。还有就是要根据题目适当进行开空间。

然后就是邻接表。

2、邻接表

在图论相关的结点建立中,更常用的是还是邻接表,对于时空的利用更加充分。

邻接表就是将图分为边集和点集,其中以点为单位分开,将该点连接相关的边放到一个边集与点和在一起,就是一个二维单位,整个邻接表就是一个二维容器,一般是用链表来进行模拟,这样利用更充分,这里只是理解,就将用数组来进行模拟。

/**
有向图邻接表存储
**/
const int N = 1005 ;
const int M = 10050 ;
int point[N] = {0} ;///代表结点,是点集,i点就是表头
int to [M] = {0} ;
int next[M] = {0} ;///i节点的下一所指节点
int num = 0 ;///计数器(表示第几边)
void AddEdge(int x , int y)///从点x到点y
{
    num ++ ;
    to[num] = y ;
    next[num] = point[y] ;
    point[x] = num ;
}

void Find(int x)
{
    int now = point[x] ;
    while(now)
    {
        printf("%d\n" , to[now]) ;
        now = next[now] ;
    }
}

以上就是学习的图的结点主要建立方法。

菜得不一样,菜出新高度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值