图论算法总结之一:图的实现

一、图的实现

1.邻接矩阵

无向图,有向图

int Graph[N][N]={
	{0,1,1},
	{0,0,1},
	{0,1,1},
};

带权值的图(有限值代表右边,无穷大表示无边)

const int INF=1<<30;
int Graph[N][N]={
	{0,INF,1},
	{INF,0,1},
	{0,INF,0},
};

2.邻接表

(1)边的属性较复杂

不带权值的情况:

vector<int> G[num];
void f(int n){
	for(int i=1;i<=n;i++){
		cin>>s>>t;
		//无向图的情况 
		G[s].push_back(t);
		G[t].push_back(i);
		//有向图的情况 
		G[s].push_back(t);
	}
}

带权值的情况:

//带权图的情况
struct edge{
	int to,cost;
	edge(int to,int cost):to(to),cost(cost){}
};
vector<edge> G[num];
void f(int n){
	for(int i=1;i<=n;i++){
		cin>>s>>t>>val;
		//无向图的情况
		edge e1(t,val),e2(s,val); 
		G[s].push_back(e1);
		G[s].push_back(e2);
		//有向图的情况
		edge e(t,val); 
		G[s].push_back(e);
	}
}

(2)顶点的属性较复杂

//换一种思路
struct vertex{
	vector<vertex*> edge;
	/*
	相关的顶点属性 
	*/
}G[num];
void f(int n){
	for(int i=1;i<=n;i++){
		cin>>s>>t;
		//无向图的情况
		G[s].edge.push_back(&G[t]);
		G[t].edge.push_back(&G[s]);
		//有向图的情况
		G[s].edge.push_back(&G[t]);
	}
}

3.两者的关系

(1)邻接矩阵:

优点:可以在常数时间内判断两点之间是否有边

缺点:要消耗|V|^2的空间

(2)邻接表:

优点:在边稀少的时候,占用内存较少

缺点:判断两点之间是否有边的时候要遍历一遍,时间复杂度大

4.重边与自环的情况

不带权值时,用邻接矩阵存储边数即可;带权值的时候,若问题需要则不得不使用邻接表


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值