【图论】树论-树的直径

P3379 【模板】最近公共祖先(LCA) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

简单模板,过了无数遍

P3128 [USACO15DEC] Max Flow P - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

树上差分

就差一点

#include<iostream>
using namespace std;
int  n,k;
int dep[50001];
int fa[50001][21];
int a[50001];
int b[50001];

struct EDGE{

int next;
int to;


}edge[100001];
int head[50001];
int tot=0;
void addedge(int u,int v){
edge[++tot].next=head[u];
edge[tot].to=v;
head[u]=tot;
}
void dfs(int u,int father){

dep[u]=dep[father]+1;
for(int i=1;(1<<i)<=dep[u];i++){
    fa[u][i]=fa[fa[u][i-1]][i-1];
}

for(int i=head[u];~i;i=edge[i].next){
    int v=edge[i].to;
    if(v==father)continue;
    fa[v][0]=u;
    dfs(v,u);
}

}

void dfss(int u,int father){


cout<<"现在u,fa"<<u<<" "
//a[u]=子树a+差分b
    a[u]=b[u];


for(int i=head[u];~i;i=edge[i].next){

    int v=edge[i].to;cout<<"现在v"<<v<<endl;
    if(v==father)continue;

    dfs(v,u);
    a[u]+=a[v];
    for(int i=1;i<=n;i++){

        cout<<a[i]<<" ";}
        cout<<endl;
}


}

int  lca(int x,int y){

if(dep[x]<dep[y])swap(x,y);

for(int i=20;i>=0;i--){
    if(dep[fa[x][i]]>=dep[y])x=fa[x][i];
    if(x==y)return x;
}


for(int i=20;i>=0;i--){
    if(fa[x][i]!=fa[y][i]){
        x=fa[x][i];
        y=fa[y][i];
    }
}


return fa[x][0];

}

int main(){
cin>>n>>k;
for(int i=1;i<=n;i++)head[i]=-1;

for(int i=1;i<=n-1;i++){
    int u,v;
    cin>>u>>v;
    addedge(u,v);
    addedge(v,u);
}

dfs(1,0);




while(k--){
int x,y;
cin>>x>>y;
int mf=lca(x,y);


b[x]++;
b[y]++;
b[mf]--;
if(mf != 1) b[fa[mf][0]]--;

}







cout<<"现在检验5的边";
for(int i=head[5];~i;i=edge[i].next)
{
cout<<edge[i].to<<" ";

}
cout<<"检验结束"<<endl;

dfss(1,0);
int ans=0;



for(int i=1;i<=n;i++){



ans=max(ans,a[i]);
}

cout<<ans;

}

P5002 专心OI - 找祖先 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

n^3 tle

上一篇:基于Maximin的异常检测方法(MATLAB)


下一篇:代码随想录Day69(图论Part05)