题目大意:
  给定一棵n带权树,每个点的权值在[1,n]范围内且互不相等,并满足子结点的权值一定小于父结点。
  现在已知一个包含根结点的联通块中个点的权值,求剩下哪些点的权值能够被求出,并求出这些权值。

思路:
  贪心。
  很显然,对于某一个结点x,如果当前只有一个可取的权值w,且小于其父结点的权值,那么这个结点的权值一定是w。
  事实上所有未知结点权值都可以尝试用这样的方法得出,关键是如何唯一确定下这个权值w。
  我们可以用一个数组max记录每个结点权值的上界,再用一个数组last记录小于某个权值能取的最大权值。
  max数组可以用一趟DFS递归出来。
  然后顺序枚举每一个权值,如果可用就加入到一个“黑箱”中,如果现在黑箱中只有一个权值w并且有未知权值的结点,说明这个节点的权值就是w。
  然后如果现在黑箱中有多个权值,未知的结点也很多,那么这些权值就作废。

 #include<cstdio>
#include<cctype>
#include<vector>
inline int getint() {
char ch;
while(!isdigit(ch=getchar()));
int x=ch^'';
while(isdigit(ch=getchar())) x=(((x<<)+x)<<)+(ch^'');
return x;
}
const int V=;
std::vector<int> c[V];
int n;
int w[V],s[V],par[V],max[V],cnt[V],last[V],root;
int find(const int x) {
return x==last[x]?x:last[x]=find(last[x]);
}
void dfs(const int x) {
if(!max[x]) {
max[x]=find(max[par[x]]-);
s[max[x]]=x;
cnt[max[x]]++;
}
for(unsigned i=;i<c[x].size();i++) {
dfs(c[x][i]);
}
}
int main() {
n=getint();
for(int i=;i<=n;i++) last[i]=i;
for(int i=;i<=n;i++) {
int p=getint();
w[i]=max[i]=getint();
if(p!=i) {
c[p].push_back(i);
par[i]=p;
} else {
root=i;
w[i]=n;
}
last[w[i]]=w[i]-;
}
dfs(root);
for(int i=,tmp=;i<=n;i++) {
if(last[i]==i) tmp++;
if(cnt[i]&&tmp==) w[s[i]]=i;
tmp-=cnt[i];
}
for(int i=;i<=n;i++) printf("%d\n",w[i]);
return ;
}

最新文章

  1. Atitit prj 项目管理与行政管理(1)------项目环境的概览与建立
  2. ThinkCMF-smeta扩展字段
  3. 全架构PaaS TAE 2.0的Docker实践
  4. BZOJ4118 : [Wf2015]Window Manager
  5. 简单几何(凸包+多边形面积) POJ 3348 Cows
  6. 浅议iOS网络数据解析
  7. 软件工程随堂作业--随机产生30到四则运算(c语言)
  8. Excel2007条件格式怎么用
  9. BZOJ 2572 高速公路
  10. Xamarin for OSX – SetUp
  11. Hacker(九)----黑客攻防前准备1
  12. Android滑动菜单框架完全解析,教你如何一分钟实现滑动菜单特效
  13. JavaScript禁止浏览器默认行为
  14. follow
  15. C++回调:利用Sink
  16. 在阿里云服务器上搭建xampp遇到的问题
  17. C#基础第九天-作业-储蓄账户(SavingAccount)和信用账户(CreditAccount)
  18. 软工网络15团队作业8——Beta阶段敏捷冲刺(Day5)
  19. python&#39;s default parameter
  20. Java 设计模式之单例模式(一)

热门文章

  1. cin.get()和cin.getline()之间的区别
  2. 20145202马超 2016-2017-2 《Java程序设计》第三次实验
  3. oracle用plsql查询死锁
  4. marshmallow: 简化Python对象系列化
  5. Jenkins+Ant+TestNG+Testlink自动化构建集成
  6. python基础-类的属性(类属性,实例属性,私有属性)
  7. 下一代Android打包工具,100个渠道包只需要10秒钟 https://github.com/mcxiaoke
  8. java基础78 Servlet的生命周期
  9. C++ : Boost : Rational 有理数类
  10. 面试题:输入两个整数 n 和 m,从数列1,2,3…….n 中 随意取几个数, 使其和等于 m