首页 > 代码库 > 求树中的最长路 (*【模板】)
求树中的最长路 (*【模板】)
两次DFS求树中的最长路。
基于邻接矩阵:
代码:
#include <stdio.h>#include <string.h>#include <vector>#include <iostream>#include <string>#include <algorithm>using namespace std;bool map[10001][10001];int n;int tail;bool vis[1001];int fa[1001];void DFS_root(int dd){ int i, j; for(i=1; i<=n; i++) { if(vis[i]==false && map[dd][i]==true ) { fa[i]=fa[dd]+1; vis[i]=true; DFS_root(i); } } int len=0; tail=1; for(j=2; j<=n; j++) { if(fa[j]>len) tail=j; } //printf("%d***\n", tail ); return;}int len=0; //记录树中最长的路径长度void DFS_len_tree(int dd){ int i, j; for(i=1; i<=n; i++) { if(vis[i]==false && map[dd][i]==true ) { fa[i]=fa[dd]+1; //由前一个节点的长度+1过来的 vis[i]=true; DFS_len_tree(i); } } len=fa[1]; for(j=2; j<=n; j++) { if(fa[j]>len) len=fa[j]; }}int main(){ int i, j; int u, v; scanf("%d", &n); for(i=0; i<=n; i++ ) { for(j=0; j<=n; j++) { map[i][j]=false; } } //map的初始化 for(i=0; i<n-1; i++) { scanf("%d %d", &u, &v ); map[u][v]=true; map[v][u]=true; } memset(vis, false, sizeof(vis)); memset(fa, 0, sizeof(fa)); vis[1]=true; DFS_root(1); memset(vis, false, sizeof(vis)); memset(fa, 0, sizeof(fa)); //记录路径长度 vis[tail]=true; DFS_len_tree(tail); printf("%d\n", len ); return 0;}
基于vector二维模拟邻接表:
代码:
#include <stdio.h>#include <string.h>#include <stdlib.h>#include <string>#include <iostream>#include <vector>#include <algorithm>#define N 100002using namespace std;vector<int>q[N];bool vis[N];int fa[N];int n, tail;int ans;void DFS_root(int dd){ int i, j; int len; len=q[dd].size(); for(i=0; i<len; i++) { if(vis[q[dd][i]]==false ) { fa[q[dd][i]]=fa[dd]+1; vis[q[dd][i]]=true; DFS_root(q[dd][i]); } } len=fa[1];tail=1; for(j=2; j<=n; j++) { if(fa[j]>len) { len=fa[j]; tail=j; } }}void DFS_len_tree(int dd){ int len, i, j; len=q[dd].size(); for(i=0; i<len; i++) { if(vis[q[dd][i]]==false) { fa[q[dd][i]]=fa[dd]+1; vis[q[dd][i]]=true; DFS_len_tree(q[dd][i]); } }}int main(){ int i, j; int u, v; scanf("%d", &n); for(i=0; i<=n; i++) q[i].clear(); for(i=0; i<n-1; i++) { scanf("%d %d", &u, &v); q[u].push_back(v); q[v].push_back(u); } memset(vis, false, sizeof(vis)); memset(fa, 0, sizeof(fa)); vis[1]=true; DFS_root(1); memset(vis, false, sizeof(vis)); memset(fa, 0, sizeof(fa)); vis[tail]=true; DFS_len_tree(tail); ans=fa[1]; for(j=2; j<=n; j++) { if(fa[j]>ans ) ans=fa[j]; } printf("%d\n", ans ); return 0;}
求树中的最长路 (*【模板】)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。