前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用邻接链表存图 详讲

用邻接链表存图 详讲

作者头像
杨鹏伟
发布2020-09-10 21:30:09
6020
发布2020-09-10 21:30:09
举报
文章被收录于专栏:ypwypw

在许多图论的题目中,我们首先要存图,之前我已经学习了用邻接矩阵存图 ,但是看许多大佬都是用邻接表存图,觉得还是学习下好!

那么我们经过一个例题来学习 邻接链表存图。

N个点,从 1 到 N 。有M 条边 ,每条用连接的2 个顶点表示。请输入每个顶点 通过 边相邻的顶点。 输入格式 : 第一行 ,N , M,两个整数,下面M行,每行两个整数,表示一条边 。

输出格式 : N行 , 第i行 的第一个数 k 表示 有多少边和 i号顶点相连 ,后面 有k个数 , 表示 哪个k个顶点和 i 连接为 一边。

代码语言:javascript
复制
#include<bits/stdc++.h>
#define maxn 200001
using namespace std;


struct node{
	int v;
	int next;
}a[maxn]; 

int n,m,p;//p为数组的空余空间下表 
int k[5001],c[5001];//邻接链表表头,k数组记长度 

void add(int u,int v){ // 把 v点插入到 u点的邻接链表 
	a[++p].v = v;  //申请一个新节点 
	a[p].next = c[u];
	c[u] = p;   // 插入到u链表头 
	k[u]++;   //链表长度增加 
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		int u,v;
		cin>>u>>v;
		add(u,v);
		add(v,u);
	} 
	for(int i=1;i<=n;i++){
		cout<<k[i]<<" ";
		for(int j =c[i];j>0;j=a[j].next)
		  cout<<a[j].v<<" ";
		  cout<<endl;
	}
	return 0;
} 

测试数据

代码语言:javascript
复制
输入:
5 6
1 3
2 4
1 4
2 3
3 5
2 5

输出:
2 4 3
3 5 3 4
3 5 2 1
2 1 2
2 2 3
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-05-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档