《算法竞赛进阶指南》0x21树和图的遍历 求dfs序以及树的重心

#include<iostream>
#include<string.h>
using namespace std;
#define maxn 100
int ver[maxn],head[maxn],nxt[maxn],size[maxn],len[maxn];
int n,m;
int vis[maxn];
int tot=0;
void addedge(int u,int v,int w){
    ver[++tot]=v;
    len[tot]=w;
    nxt[tot]=head[u];
    head[u]=tot;
}
int ans=0x7fffffff,pos;
void dfs(int x){
    vis[x]=1;
    size[x]=1;
    int max_part=0;
    for(int i=head[x];i;i=nxt[i]){
        int v=ver[i];
        if(vis[v])continue;
        vis[v]=1;
        dfs(v);
        size[x]+=size[v];
        max_part=max(max_part,size[v]);
    }
    max_part=max(max_part,n-size[x]);
    if(max_part<ans){
        ans=max_part;
        pos=x;
    }
}
void init(){
    cin>>n>>m;
    tot=0;
    memset(vis,0,sizeof(vis));
    int u,v,w;
    for(int i=0;i<m;i++){
        cin>>u>>v>>w;
        addedge(u,v,w);
        addedge(v,u,w);
    }
    dfs(1);
    cout<<"树的重心:"<<pos<<endl;
    cout<<"划分的最大子树大小:"<<ans<<endl;
}
int d[maxn];
int dfn=0;
void dfs2(int x){//获取dfs序 
    d[dfn++]=x;//记录第一次访问的时间戳 
    vis[x]=1;
    for(int i=head[x];i;i=nxt[i]){
        int y=ver[i];
        if(vis[y])continue;
        dfs2(y);
    }
    d[dfn++]=x;//回溯时刻记录访问的编号 
}
int main(){
    init();
    memset(vis,0,sizeof(vis));
    dfs2(1);
    for(int i=0;i<dfn;i++)cout<<d[i]<<" ";
}
9 8
1 2 1
1 7 1
1 4 1
2 8 1
2 5 1
4 3 1
4 6 1
3 9 1

 

posted @ 2020-06-18 16:59  WA自动机~  阅读(194)  评论(0编辑  收藏  举报