poj3310Caterpillar(树直径)
2016-06-23 15:36
393 查看
1.连通性
2.树
3.求直径
2.树
3.求直径
struct UNION { int F[101]; void init(int n = 0) { memset(F, -1,sizeof F); } int find(int u) { return F[u] == -1?u:F[u] = find(F[u]); } bool unit(int u,int v) { int t1 = find(u); int t2 = find(v); if (t1 == t2) return false; F[t1] = t2; return true; } bool check(int n) { int cnt = 0; for (int i = 1;i <= n;++i) if (F[i] == -1) cnt++; return cnt == 1; } }UF; vector<vector<int> > G; int dep[123]; int pre[123]; void dfs(int u,int fa) { for (int i = 0;i < G[u].size();++i) { int v = G[u][i]; if (v == fa) continue; dep[v] = dep[u] + 1; pre[v] = u; dfs(v, u); } } bool mark[123]; int main(int argc, const char * argv[]) { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); // clock_t _ = clock(); int n, m; while(~scanf("%d", &n) && n) { scanf("%d", &m); UF.init(); int u, v; G.clear(); G.resize(n + 2); bool flag = true; for (int i = 1;i <= m;++i) { scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); if (!UF.unit(u, v)) flag = false; } if (!flag || !UF.check(n)) { printf("Graph %d is not a caterpillar.\n", ++nCase); continue; } int st, ed; st = 1; dep[1] = 0; dfs(st, -1); ed = 1; for (int i = 1;i <= n;++i) if (dep[i] > dep[ed]) ed = i; dep[st = ed] = 0; dfs(st, -1); ed = 1; for (int i = 1;i <=n;++i) if (dep[i] > dep[ed]) ed = i; memset(mark, false,sizeof mark); int o = ed; while(o != st) { mark[o] = true; o = pre[o]; } mark[st] = true; flag = true; for (int i = 1;i <= n;++i) { if (mark[i]) continue; bool tmp = false; for (int j = 0;j < G[i].size();++j) { if (mark[G[i][j]]) { tmp = true; break; } } if (!tmp) flag = false; } if (!flag) printf("Graph %d is not a caterpillar.\n", ++nCase); else printf("Graph %d is a caterpillar.\n", ++nCase); } // printf("\nTime cost: %.2fs\n", 1.0 * (clock() - _) / CLOCKS_PER_SEC); return 0; }
相关文章推荐
- Codeforce Round #379 (Div. 2) 734 E Anton and Tree(tree 缩点 树的直径 )
- Android消息机制---MessageQueue的工作原理
- 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一
- Android 沉浸式状态栏 一设置状态栏颜色
- React之JSX入门
- Yii CDbCriteria类中方法
- NPOI常用功能工具类
- 编写itemdecoration,得到绘制分割线的drawable的方法汇总
- java定时任务1:Timer
- java内存优化
- VC中使用ADO开发数据库应用程序简明教程
- Powershell 中的比较运算符
- 动态规划:从新手到专家
- vi 常用命令
- spark配置(1)
- ASP.Net MVC开发基础学习笔记(1):走向MVC模式
- recylview和listview中item如何设置点击效果?
- 怎么让html里的js脚本延迟5秒运行?
- 有关iOS相册的调用
- 互联网协议入门(二)