《算法竞赛进阶指南》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
每一个不曾起舞的日子,都是对生命的辜负。