zoukankan      html  css  js  c++  java
  • 《算法竞赛进阶指南》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
  • 相关阅读:
    Android中得到布局文件对象有三种方式
    android中的键值对
    .length()与.length与.size()
    异常处理
    Python操作Excel
    写一个简单的爬虫(博客)
    开发一个登录接口(Mysql)
    常用模块
    内置函数
    装饰器
  • 原文地址:https://www.cnblogs.com/randy-lo/p/13158499.html
Copyright © 2011-2022 走看看