链式前向星

链式前向星其实就是静态建立的邻接表,时间效率为O(m),空间效率也为O(m)。遍历效率也为O(m)。
head数组初始化为-1,可以令以i为起点的第一条边赋值为-1,使得edge[j].next=-1使j=-1使循环结束。
数据

5 7
1 2 1 //权值为1 edge[0].to=2;edge[0].next=-1;head[1]=0
2 3 2 //权值为2 edge[1].to=3;edge[1].next=-1;head[2]=1;
3 4 3 //权值为3 edge[2].to=4;edge[2].next=-1;head[3]=2;
1 3 4 //权值为4 edge[3].to=3;edge[3].next=0;head[1]=3;
4 1 5 //权值为5 edge[4].to=1;edge[4].next=-1;head[4]=4;
1 5 6 //权值为6 edge[5].to=5;edge[5].next=3;head[1]=5;
4 5 7 //权值为7 edge[6].to=5;edge[6].next=4;head[4]=6;

输出

1 //以1为起点的边的集合
1 5 6
1 3 4
1 2 1
 
2 //以2为起点的边的集合
2 3 2
 
3 //以3为起点的边的集合
3 4 3
 
4  //以4为起点的边的集合
4 5 7
4 1 5
 
5 //以5为起点的边不存在

初始化代码:

void init()
{
	for(int i=0;i<=n;i++)
		head[i]=-1;
		cnt=0;
}

加边函数代码:

void AddEdge(int u,int v,int w)
{
	edge[cnt].w=w;//权值
	edge.[cnt].to=v;//终点
	edge[cnt].next=head[u];/u起点上一条边的编号
	head[u]=cnt++;//更新编号,cnt为当前编号
}

建立结构体:

struct Edge
{
	int to,w,next;
}edge[maxn];//maxn为点数最大值

总体代码:

#include<stdio.h>
#include<iostream>
using namespace std;
#define maxn 1000
int n,m,cnt;
int head[maxn];//head数组表示以i为起点的第一条边的编号
struct Edge
{
	int to,w,next;
}edge[maxn];//maxn为点数最大值
void init()//初始化函数
{
	for(int i=0;i<=n;i++)
		head[i]=-1;
		cnt=0;
}
void AddEdge(int u,int v,int w)//加边函数
{
	edge[cnt].w=w;//权值
	edge[cnt].to=v;//终点
	edge[cnt].next=head[u];//u起点上一条边的编号
	head[u]=cnt++;//更新编号,cnt为当前编号
}
int main()
{
	cin>>n>>m;//n为点数,m为边数
	int u,v,w;//u起点,v终点,w权值
	init();//初始化
	for(int i=1;i<=m;++i)
	{
		cin>>u>>v>>w;
		AddEdge(u,v,w);
	}
	for(int i=1;i<=n;++i)
	{
		cout<<i<<endl;
		for(int j=head[i];j!=-1;j=edge[j].next)
		{
			cout<<i<<" "<<edge[j].to<<" "<<edge[j].w<<endl;
		}
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值