建邻接表的两种方式

本文介绍了一种使用邻接表表示图数据结构的方法,并提供了两种不同的实现方式:一种是基于数组和结构体的传统C语言风格实现;另一种是利用C++标准库中的vector容器进行的简化实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/* 
*  构建邻接表模板 
* 
*/  
#include<stdio.h>  
#include<string.h>  
int head[100100];//表头,head[i]代表起点是i的边的编号  
int cnt;//代表边的编号  
struct s  
{  
    int u;//记录边的起点  
    int v;//记录边的终点  
    int w;//记录边的权值  
    int next;//指向上一条边的编号  
}edge[100010];  
void add(int u,int v,int w)//向所要连接的表中加入边  
{  
    edge[cnt].u=u;  
    edge[cnt].v=v;  
    edge[cnt].w=w;  
    edge[cnt].next=head[u];  
    head[u]=cnt++;  
}  
int main()  
{  
    int n;  
    while(scanf("%d",&n)!=EOF)  
    {  
        int i;  
        cnt=0;  
        memset(head,-1,sizeof(head));//清空表头数组  
        for(i=0;i<n;i++)  
        {  
            int u,v,w;  
            scanf("%d%d%d",&u,&v,&w);  
            add(u,v,w);  
        }  
        int u,v,w;  
        scanf("%d",&u);  
        for(i=head[u];i!=-1;i=edge[i].next)//输出所有与起点为u相连的边的终点和权值  
        {  
             v=edge[i].v;  
             w=edge[i].w;  
             printf("%d %d\n",v,w);  
        }  
    }  
    return 0;  
}  
 

#include<stdio.h>    
#include<vector>    
using namespace std;    
#define SIZE 1000    
vector<int> adj[SIZE]; 
int n,m;    
void init()    
{    
	scanf("%d%d",&n,&m);     
	int i,j;    
	int a,b;    
	for(i=1;i<=n;i++)    
	{    
		adj[i].clear(); //清除     
	}    
	for(i=1;i<=m;i++)    
	{    
		scanf("%d%d",&a,&b);    
		adj[a].push_back(b);    
		adj[b].push_back(a);     
	}    
}    
void print()    
{    
	int i;    
	int j;    
	 
	for(i=1;i<=n;i++)    
	{     
		printf("dian %d:",i);    
		for(j=0;j<adj[i].size();j++)    
		{    
			printf("%d ",adj[i][j]);     
		}     
		printf("\n");    
	}    
}    
int main()    
{    
	int t;    
	scanf("%d",&t);    
	while(t--)    
	{     
		init();     
		print();    
	}     
	return 0;     
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值