树&图
一些数组:如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);
}
}
}