深度优先搜索dfs(poj 1655)
2016-09-02 20:45
344 查看
题目:poj 1655
题意:给定一个树状图,要求去掉一个节点,得到几个子树,并且规定这些子树中拥有的最大节点的子树的节点数为去掉该节点的平衡值,求该平衡值最小为多少,并且求出此时去掉的是哪个点,当平衡值相当时要求去掉的点的序号最小
题解:建树,再进行一次深度优先搜索,找出该点的各个子树中有多少节点,取最大值,当然题目中是无向连接,所以要考虑双向,要用一个数组表示该点事前有没考虑
代码:
题意:给定一个树状图,要求去掉一个节点,得到几个子树,并且规定这些子树中拥有的最大节点的子树的节点数为去掉该节点的平衡值,求该平衡值最小为多少,并且求出此时去掉的是哪个点,当平衡值相当时要求去掉的点的序号最小
题解:建树,再进行一次深度优先搜索,找出该点的各个子树中有多少节点,取最大值,当然题目中是无向连接,所以要考虑双向,要用一个数组表示该点事前有没考虑
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<algorithm> #include<vector> using namespace std; int minn; vector<int> son[20050]; int vis[20050]; int go[20050]; //记录是否访问过该点 int dfs(int root,int all) { go[root]=1;//记录该点已经访问过 int maxx=0; int sum=1; for(int i=0;i<son[root].size();i++) { int id=son[root][i]; if(go[id]) continue; int d=dfs(id,all); maxx=max(maxx,d); sum+=d; } son[root].clear(); maxx=max(maxx,all-sum); if(maxx<vis[minn] || maxx==vis[minn] && minn>root){vis[root]=maxx;minn=root;} return sum; } int main() { int t,n; scanf("%d",&t); int f,s; while(t--) { minn=1; memset(vis,0,sizeof(vis)); memset(go,0,sizeof(go)); scanf("%d",&n); for(int i=1;i<n;i++) { scanf("%d %d",&f,&s); son[f].push_back(s); son[s].push_back(f); vis[i]=259999; } vis =259999; dfs(1,n); printf("%d %d\n",minn,vis[minn]); } return 0; }
相关文章推荐
- POJ-1979 深度优先搜索DFS
- poj1312 dfs 深度优先搜索
- ACM-POJ 1562 DFS 深度优先搜索
- poj1088 滑雪 dp记忆化搜索 dfs深度优先搜索
- poj3009之深度优先搜索 dfs解法
- POJ-2488 A Knights Journey-深度优先搜索DFS
- 算法 DFS深度优先搜索
- matlab练习程序(广度优先搜索BFS、深度优先搜索DFS)
- 深度优先搜索 DFS
- DFS深度优先搜索案例:马戏团叠罗汉
- POJ3009 - Curling 2.0 - 深度优先搜索
- 22.基于 邻接表 表示的 深度优先搜索dfs 和 广度优先搜索bfs
- POJ 1683 所谓DFS(深度优先遍历)
- HDU/HDOJ 1241 Oil Deposits (DFS)深度优先搜索
- DFS 深度优先搜索
- 深度优先搜索DFS——图邻接矩阵表示
- poj1088 DFS深度搜索
- 深度优先搜索 DFS
- DFS 深度优先搜索
- 深度优先搜索DFS——图邻接表表示