VK Cup 2016 - Qualification Round 2 C. Road Improvement dfs
2016-09-13 09:07
423 查看
题意
给你一棵树,n点n-1条边,现在这些边都不存在,你要修起来。你可以选择一条边修理,如果这个边的两边的城市都没有在修理其他边的话。
每次修理需要一天的时间。
问你最少多少天可以修完,并且把方案输出。
题解:
直接dfs就好了,我们记录一个上一个边传过来的时间和这条边修理的时间就好了保证不重复就行了。
#include <set> #include <map> #include <stack> #include <queue> #include <deque> #include <cmath> #include <vector> #include <string> #include <cstdio> #include <cstdlib> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define L(i) i<<1 #define R(i) i<<1|1 #define INF 0x3f3f3f3f #define pi acos(-1.0) #define eps 1e-12 #define maxn 200100 #define MOD 1000000007 int n; vector<pair<int,int> > E[maxn]; vector<int> ans[maxn]; int cnt; void dfs(int u,int pre,int time) { int now = 0; for(int i = 0; i < E[u].size(); i++) { int v = E[u][i].first; if(v == pre) continue; now++; if(now == time) now++; cnt = max(cnt,now); ans[now].push_back(E[u][i].second); dfs(v,u,now); } } int main() { int t; //scanf("%d",&t); while(scanf("%d",&n) != EOF) { for(int i = 1; i < n; i++) { int x,y; scanf("%d%d",&x,&y); E[x].push_back(make_pair(y,i)); E[y].push_back(make_pair(x,i)); ans[i].clear(); } cnt = 0; dfs(1,-1,0); printf("%d\n",cnt); for(int i = 1; i <= cnt; i++) { printf("%d ",ans[i].size()); for(int j = 0; j < ans[i].size(); j++) printf("%d ",ans[i][j]); printf("\n"); } } return 0; }
相关文章推荐
- 在Wcf中应用ProtoBuf替代默认的序列化器
- 最大奇约数
- 常用sql语句
- Vert.x 核心模块 特性介绍(一)
- 编译器错误 C2989
- 排序算法之插入排序
- 如果你也会C#,那不妨了解下F#(6):面向对象编程之“类”
- logstash 字段类型转换后 需要刷新
- 电脑优化,提速
- Android 自定义View 点击可旋转的饼状图
- 树的重心
- logstash 字段类型转换后 需要刷新
- target='_blank' 安全漏洞
- Java中常见数据结构:list与map -底层如何实现
- 更靠谱的H5横竖屏检测方法(js代码)
- 选择手机联系人号【Android】
- 浅谈阻止事件冒泡的两种方法
- Python中操作mysql的pymysql模块详解
- eclipse的使用
- java的system.arraycopy()方法