【算法笔记】图论 邻接表

本文深入探讨图论中的邻接表概念,解释其存储方式和相对于邻接矩阵的空间优势。通过两个具体题目,阐述了邻接表在解决连通性问题中的应用,包括寻找与特定节点不连通的节点和确定犯罪团伙数量的问题。
摘要由CSDN通过智能技术生成

关于图论:

这篇博客主要写邻接表,今天,我们就来认识一下什么是邻接表吧,并看一看邻接表的题目怎么做吧!

1.什么是邻接表

邻接表的作用大体和邻接矩阵相同,但是更加省空间。邻接矩阵使用二维数组存储的,二邻接表室友一位数组和结构体存储的,不想邻接矩阵那样定义的简单暴力,有比较特殊的读入方法。

2.邻接表的存储方式

邻接表,我们需要用一个link数组来存储所有和第i个点连通的所有点及其权值,然后通过link数组在结构体数组e上进行遍历,一直查找next知道next为0即可,y表示与第i个点所连通的店,v表示权值,next表示和i连通的下一个点。

3.邻接表的存储如何用代码实现

struct edge{
    int y,v,next;		//y表示这条边的终点编号,v是权值;
};  				//next表示同起点下条边的编号是多少
edge e[maxm+10];  //边表。
int linkk[maxn+10];  //起点表 link[i]表示由i出去的第一条边的下标是多少

void insert(int ss,int ee,int vv)//ss为起点,ee为终点,vv为权值。
{  
	e[++t].y=ee; e[t].v=vv;  	//t表示有t条边,是个全局变量。
	e[t].next=linkk[ss]; linkk[ss]=t;
}

void init(){
    scanf("%d %d %d",&n,&p,&m);
	for (int i=0;i<m;i++)    {
        int xx,yy,zz;
        scanf("%d%d%d",&xx,&yy,&zz);
		insert(xx,yy,zz);
		insert(yy,xx,zz);  //这里插入的是无向图,所以两条边都要插入。
    }    
}    


4.田野上的环

题目描述

FJ 让他的N (1 <= N <= 250)只编号为从1到N的奶牛在田地里玩.这些奶牛决定用M条1<=M<=N*(N+1)/2)牛绳将各自连接起来.当然,不会出现一对牛被两条及以上牛绳连接起来.输入告诉你每一条牛绳连接的两只奶牛C1和C2(1 <= c1 <= N; 1 <= c2 <= N; c1 <> c2).

FJ要求奶牛们与1号奶牛相连.现在你要帮助FJ找出所有没有与1号奶牛相连的奶牛.这里的相连既可以是直接的,也可以是间接的(特别的,1号奶牛总是与自己相连).将没有与1号奶牛相连的奶牛的编号升序输出.如果你找不到这样的一只牛,那么就输出0. 解释一下的话,看这个有6只奶牛和4个连接的例子:

此图明显有差别,请自己根据样例来画图

  1----2  4---5

   \   |

    \   |     6

     \  |

      3

很明显,4,5,6号牛没有同1号牛相连.

输入格式

第1行:两个用空格分开的整数N,M 第2..M+1行:每一行有两个整数.第i+1行描述的是绳子i连接的两只奶牛的编号,即C1和C2.

输出格式

很多行:每一行包含一个整数,意义如题目所说.升序输出.

样例数据

input

6 4
1 3
2 3
1 2
4 5

output

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值