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

一、图的实现

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.重边与自环的情况

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


猜你喜欢

转载自blog.csdn.net/qq_41333528/article/details/80220086