搜索算法(蓝桥杯)--图的存储

 

B站视频链接:B02 图的存储_哔哩哔哩_bilibili

1、邻接矩阵

搜索算法(蓝桥杯)--图的存储_第1张图片

#include 
using namespace std;

const int N=1010,M=1010;
int n,m,a,b,c;
int w[N][N];//边权
int vis[N];//判重

void dfs(int u){
	vis[u]=true;//标记已经访问
	for(int v=1;v<=n;v++){
		if(w[u][v]){
			printf("%d %d %d\n",u,v,w[u][v]);
			if(vis[v])continue;//判重防止进入死循环
			dfs(v);//递归下一个点 
		}
	} 
}

int main(){
	cin>>n>>m;//n行n列矩阵,m个边权
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c;
		w[a][b]=c;//a到b之间连接一条有向边
		//w[b][a]=c  
	}
	dfs(1);
	return 0;
} 

 2、边集数组

搜索算法(蓝桥杯)--图的存储_第2张图片

#include 
using namespace std;

const int N=1010,M=1010;
int n,m,a,b,c;
int vis[N];//判重
struct edge{
	int u,v,w;//起点,终点,边权 
}e[M];//边集数组

void dfs(int u){
	vis[u]=true;
	for(int i=1;i<=m;i++){//暴力搜索与该点有关的所有边 
		if(e[i].u==u){
			int v=e[i].v,w=e[i].w;
			printf("%d %d %d\n",u,v,w);
			if(vis[v])continue;
			dfs(e[i].v);//搜下一个点(该边的终点) 
		}
	}
}

int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c;
		e[i]={a,b,c};//i为边的编号 
		//e[i]={c,b,a};
	}
	dfs(1);
	return 0;
} 

 3、邻接表

搜索算法(蓝桥杯)--图的存储_第3张图片

#include 
using namespace std;

const int N=510;
int n,m,a,b,c;
struct edge{int v,w;};
vector e[N];

void dfs(int u,int fa){//当前点与它的父节点 
	for(auto ed:e[u]){
		int v=ed.v,w=ed.w;
		if(v==fa)continue;
		printf("%d %d %d\n",u,v,w);
		dfs(v,u);
	}
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=m;i++){
		cin>>a>>b>>c;
		e[a].push_back({b,c});//a,b之间连权值为c的边
		//e[b].push_back({a,c}); 
	}
	dfs(1,0); 
	
	return 0;
}

 4、链式邻接表

搜索算法(蓝桥杯)--图的存储_第4张图片

5、链式前向星

搜索算法(蓝桥杯)--图的存储_第5张图片 

你可能感兴趣的:(搜索算法,蓝桥杯,深度优先,算法,图论)