搜索与图论(二)

图的储存方式

1.邻接矩阵
创建一个二维数组V,将点作为下标,数组值代表这条边的权重。

2.数组存边

struct Edge
{
	int value;//边的权
	int to;//边的终点
	int from;//边的起点 
}edge[500005];
//存边
for(int i=0;i<m;i++)
{
	cin>>u>>v>>w;
	edge[i].from=u;
	edge[i].to=v;
	edge[i].value=w;
 } 

3.邻接表

vector<int> a[500005];
//存边
for(int i=0;i<m;i++)
{
	cin>>u>>v;//u点与v点是连通的
	a[u].push_back(v);//a[i]存的为与i点相连的点,但一般不存边权 
}
//遍历
for(int i=0;i<=n;i++)//遍历起点
    for(int j=0;j<a[i].size();j++)//遍历和i相连的点
    	cout<<"起点:"<<i<<"终点:"<<a[i][j]<<endl; 

4.链式向前星

struct Edge
{
	int next;//下个同起点的边的在edge数组里的下标 
	int value;//当前边的边权 
	int to;//这条边的终点 
}edge[500005];
int first_edge[500005];//first_edge[i]存的是以i为起点的第一个边在edge数组里的下标
//存边
void add(int u,int v,int val,int i)
{
	edge[i].to=v;//记录这条边的终点
	edge[i].value=val;//边权
	edge[i].next=first_edge[u];//下条同起点的边的下标为原先的第一条边的下标
	first_edge[u]=i;//新的第一条边更新 
} 
//遍历 
for(int j=1;j<=n;j++)//遍历所有起点[1,n]
    for(int i=first_edge[j];i!=0;i=edge[i].next)//遍历起点为j的所有边
	    cout<<"起点:"<<j<<"终点:"<<edge[i].to<<"边权:"<<edge[i].value<<endl;
		 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值