图片加载可能有点慢,请跳过题面先看题解,谢谢




题目给出了一个信息:答案是有向边最长路 \(k\) 的值或者是 \(k+1\) 的值
那么题目就变成了:求是否有一种给无向边定向的方案,使得在以有向边最长路的起点为根的树(其实也并不是一棵树,只是当成一棵树来处理)内,点的深度在 \([1,k]\) 内
如果存在这样的方案,答案为 \(k\) ,否则答案为 \(k+1\)
\(k\) 的值和有向边最长路的起点我们可以暴力 \(dfs\) 在 \(O(n)\) 的时间内求出来
关键是怎么求方案?
$
$
这样设:\((bool)f[x][dep]\) 为,到 \(x\) 这个点深度为 \(dep\) 时,以 \(x\) 为根的子树是否可行
对于与 \(x\) 相连的边我们可以这样转移:

  1. 初值,\(f[x][dep]=1\);
  2. \(x\)->\(son\) 或者 \(x\)--\(son\),--->\(f[son][dep+j]\);
  3. \(son\)->\(x\) 或者 \(x\)--\(son\),--->\(f[son][dep-j]\);

其中,\(1\leq j,dep-j\) ;\(dep+j\leq k\)
\(f[x][dep]=f[x][dep]\wedge(f[son]有一个为 1 )\)
$
$

//made by Hero_of_Someone
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define il inline
#define RG register
using namespace std;

int n,u,k,Dis[210];
bool vis[210][210],f[210][210];
int num,head[210],nxt[410],to[410],w[410];
il void add(int u,int v,int d){ //d: 0,u->v;1,u--v;2,v->u;
   nxt[++num]=head[u];to[num]=v;w[num]=d;head[u]=num;
}

il void init(){
   num=0; memset(head,0,sizeof(head));
   n=u; char s[10];
   do{
      n=max(n,u);
      while(scanf("%s",s)==1){
         if(s[0]=='0') break;
         RG int v=0,len=strlen(s);
         RG char ch='n';
         for(int i=0;i<len;i++)
            if(s[i]=='u'||s[i]=='d') ch=s[i];
            else v*=10,v+=s[i]-'0';
         n=max(n,v);
         if(ch=='n') add(u,v,1),add(v,u,1);
         if(ch=='d') add(u,v,0),add(v,u,2);
         if(ch=='u') add(u,v,2),add(v,u,0);
      }
      scanf("%d",&u);
   }while(u);
}

il void pre(int x){
   if(Dis[x]) return ; Dis[x]=1;
   for(int i=head[x];i;i=nxt[i]){
      if(w[i]) continue; pre(to[i]);
      Dis[x]=max(Dis[x],Dis[to[i]]+1);
   }
}

il bool dfs(int fa,int x,int dep){
   if(vis[x][dep]) return f[x][dep];
   vis[x][dep]=f[x][dep]=1;
   for(int i=head[x];i;i=nxt[i]){
      RG int v=to[i]; if(v==fa) continue;
      RG bool flag=0;
      if(!w[i]||w[i]==1)
         for(int j=1;(!flag)&&dep+j<=k;j++)
            flag=dfs(x,v,dep+j);
      if(w[i]==2||w[i]==1)
         for(int j=1;(!flag)&&(dep-j);j++)
            flag=dfs(x,v,dep-j);
      f[x][dep]=f[x][dep]&flag;
   }
   return f[x][dep];
}

il void work(){
   memset(Dis,0,sizeof(Dis));
   for(int i=1;i<=n;i++) pre(i);
   RG int Max=1; for(int i=2;i<=n;i++) if(Dis[i]>Dis[Max]) Max=i;
   k=Dis[Max]; memset(vis,0,sizeof(vis));
   if(dfs(0,Max,1)) printf("%d\n",k);
   else printf("%d\n",k+1);
}

int main(){ while(scanf("%d",&u)&&u){ init(); work(); } return 0; }

[UVALive 3683] A Scheduling Problem的更多相关文章

  1. 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem

     UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...

  2. 【UVA 1380】 A Scheduling Problem (树形DP)

    A Scheduling Problem   Description There is a set of jobs, say x1, x2,..., xn <tex2html_verbatim_ ...

  3. UVALive 7457 Discrete Logarithm Problem (暴力枚举)

    Discrete Logarithm Problem 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/D Description ...

  4. Gym 101194A / UVALive 7897 - Number Theory Problem - [找规律水题][2016 EC-Final Problem A]

    题目链接: http://codeforces.com/gym/101194/attachments https://icpcarchive.ecs.baylor.edu/index.php?opti ...

  5. UVALive 6909 Kevin's Problem 数学排列组合

    Kevin's Problem 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid ...

  6. uva1380 A Scheduling Problem

    按紫书来注意这道题的题目给了很大的方便,就相当于验证k是不是答案,不是的话就是k+1 #include<iostream> #include<string> #include& ...

  7. UVA 1380 A Scheduling Problem

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  8. UVALive - 7041 G - The Problem to Slow Down You

    题意:求两个串的公共回文子串个数 题解:建两个回文自动机,从0和1各跑一边就是答案了,因为对于回文自动机来说,从头开始dfs就能找出该字符串的所有回文串 //#pragma GCC optimize( ...

  9. UVALive - 3521 Joseph's Problem (整除分块)

    给定$n,k$$(1\leqslant n,k\leqslant 10^9)$,计算$\sum\limits _{i=1}^nk\: mod\:i$ 通过观察易发现$k\%i=k-\left \lfl ...

随机推荐

  1. Post请求和Get请求;@RequestBody和@RequestParam

    1.@RequestBody用于Post请求,接收json数据,例如:@RequestBody User user 例如:@RequestBody Map map .不要用于Get请求. 2.@Req ...

  2. CentOS7上部署ASP.Net Core 2.2应用

    前言 在CentOS7上部署ASP.Net Core应用是我的技术路线验证的一部分,下一个产品计划采用ASP.Net Boilerplate Framework开发.因此需要求提前进行一下技术验证,在 ...

  3. 报错android.view.InflateException: Binary XML file line #11: Attempt to invoke virtual method 'boolean

    出现这种问题,打开Android monitor的调试信息发现是 android.view.InflateException: Binary XML file line #11: Attempt to ...

  4. django-simple_tag、filter

    simple_tag与filter的用法 1.支持自定义函数处理方法 2.支持模板调用 创建步骤: a.在app目录下创建templatetags文件夹 b.在templatetags中创建任意名称. ...

  5. 最新!2016中国城市GDP排名出炉

    2017年1月20日,国家统计局公布:2016年中国国内生产总值GDP达744127亿元,同比增长6.7%,城市GDP方面:截至1月20日,全国大部分城市的去年经济运行数据已经公布,根据信息汇总,20 ...

  6. ipmitool命令详解

    基础命令学习目录首页 原文链接:https://www.cnblogs.com/EricDing/p/8995263.html [root@localhost ~]# yum install -y i ...

  7. 实验二 Java面向对象程序设计 20135321

    课程:Java程序设计   班级:1353    姓名:余佳源  学号:20135321 成绩:             指导教师:娄嘉鹏      实验日期:2015-5-8 实验密级:       ...

  8. 今日事——Sprint计划会议

    一.   Sprint需求: 解屏提醒部分 界面设计 登录功能 备忘功能 成就系统 二.工作认领: 因有成员请假回家,所以延后认领,目前主要任务是学习如何在andriod平台开发并搭建开发环境. 网上 ...

  9. 读书笔记 之 java编程思想3

    现在已经读到第二章  ,这个发现好多已经能都知道了  但是还是有自己比较生疏的比如说就是 储存到什么地方:书中介绍五种储存的地方 分别为1储存器,2堆栈,3堆4常量储存 5非RAM储存,java的出来 ...

  10. week4f:个人博客作业

    8,工作中的照片 9,对方编程习惯总结 宋成鑫(以后简称老宋).老宋,对编程的思想看的比较重,具体什么是编程的思想,我是也不是很清楚.但是,在编程过程中,老宋的一些话给了我启示.这或许就是编程的思想吧 ...