树&图的存储&遍历分类模板

树&图

一些数组:如vis[]的重置的时机
flag的使用

树:

从根节点/某个节点遍历

存储:

vector<int>child[N];
记录每个节点的孩子节点编号//1-》多
f_id child_id..
f_id 对应孩子下标--转换

L2-026 小字辈 (25分)

vector<int>parent[N]; 记录每个节点的父母节点编号//1-》多

L2-016 愿天下有情人都是失散多年的兄妹 (25分)

int father[N]; 记录每个节点的父亲节点编号//多-》1

L2-030 冰岛人 (25分)?????????????

//结构体ing…

dfs:遍历

L2-031 深入虎穴 (25分)

//1.从根节点从上至下深度遍历,找孩子、层数
//vector<int>child[N];
//记录每个节点的孩子节点编号//1-》多

dfs(1,1);//root编号,root所在层数
void dfs(int v,int depth){
	if(child[v].size()==0){
		//找到孩子节点了,不要放过她
		//让我来
		//可以做最深层数/每层节点数
		return;
	}
	for(int i=0;i<child[v].size();i++){
		dfs(child[v][i],depth+1);
	}
}
//2.从某个孩子从下至上深度遍历,找父母祖先
//vector<int>parent[N];
//记录每个节点的父母节点编号//1-》多

for(int i=0;i<n;i++)
	dfs(i,0);//孩子编号,孩子所在层数
	
void dfs(int v,int depth){
	//可以标记
	if(跳出条件(可以是层数)){
		//操作
		return;
	}
	for(int i=0;i<father[v].size();i++){
		dfs(father[v][i],depth+1);
	}
}


father[]ing…

图:

每个节点遍历

存储:
邻接矩阵:int G[N][N]<1000(编号)
邻接表:vector<int>G[N]>1000(编号)

//存储关系:
	//1.给2个在同1边的点
	//a.邻接矩阵//对应元素可以是边权,点权可以用数组或是结构体存储
	G[a][b]=1;
	G[b][a]=1
	//b.邻接表//一般没有涉及点权---如果有,则用数组或是结构体
	G[a].push_back(b);
	G[b].push_back(a);

遍历:(每个节点都要作为起始点来遍历)
遍历相邻一圈节点:不是dfs
图的着色 分而治之 图的覆盖

//邻接矩阵:
check();
bool check(){
	bool flag;
	for(int i=0;i<=n;i++){//初始节点的编号
		for(int j=0;j<=n;j++){//每个节点的编号
			if(i!=j&&G[i][j]==1&&跳出条件(异常事件)){
				flag=false;
				break;
			}
		}
		if(flag==false)
			break;
	}
	return flag;
}

//邻接表:
check();
bool check(){
	for(int i=0;i<n;i++){//初始节点的编号
		for(int j=0;j<G[i].size();j++){//与初始节点编号相连的编号
			if(跳出条件(异常事件)){
				flag=false;
				break;
			}
		}
		if(flag==false)
			break;
	}
	return flag;
}

遍历所有节点:dfs(孩子深度)vis标记

//邻接矩阵
for(int i=0;i<n;i++){//每个初始顶点的编号
	if(vis[i]==0)
		dfs(i,1);
}
void dfs(int v.int depth){
	vis[v]=1;
	if(跳出条件(异常事件))return;
		for(int j=0;j<n;j++){
			if(G[i][j]==1&&vis[j]==0){//有关系&没访问
				dfs(j,depth+1);
			}
		}
}
//邻接表
for(int i=0;i<n;i++){
	if(vis[i]==0)
		dfs(i,1);
}
void dfs(int v,int depth){
	vis[v]=1;
	if(跳出条件(异常事件))return;
	for(int i=0;i<G[v].size();i++){
		if(vis[G[v][i]]==0){
			dfs(G[v][i],depth+1);
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值