[UVALive 3683] A Scheduling Problem
图片加载可能有点慢,请跳过题面先看题解,谢谢





题目给出了一个信息:答案是有向边最长路 \(k\) 的值或者是 \(k+1\) 的值
那么题目就变成了:求是否有一种给无向边定向的方案,使得在以有向边最长路的起点为根的树(其实也并不是一棵树,只是当成一棵树来处理)内,点的深度在 \([1,k]\) 内
如果存在这样的方案,答案为 \(k\) ,否则答案为 \(k+1\)
\(k\) 的值和有向边最长路的起点我们可以暴力 \(dfs\) 在 \(O(n)\) 的时间内求出来
关键是怎么求方案?
$
$
这样设:\((bool)f[x][dep]\) 为,到 \(x\) 这个点深度为 \(dep\) 时,以 \(x\) 为根的子树是否可行
对于与 \(x\) 相连的边我们可以这样转移:
- 初值,\(f[x][dep]=1\);
- \(x\)->\(son\) 或者 \(x\)--\(son\),--->\(f[son][dep+j]\);
- \(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的更多相关文章
- 【暑假】[深入动态规划]UVa 1380 A Scheduling Problem
UVa 1380 A Scheduling Problem 题目: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=41557 ...
- 【UVA 1380】 A Scheduling Problem (树形DP)
A Scheduling Problem Description There is a set of jobs, say x1, x2,..., xn <tex2html_verbatim_ ...
- UVALive 7457 Discrete Logarithm Problem (暴力枚举)
Discrete Logarithm Problem 题目链接: http://acm.hust.edu.cn/vjudge/contest/127401#problem/D Description ...
- 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 ...
- UVALive 6909 Kevin's Problem 数学排列组合
Kevin's Problem 题目连接: https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid ...
- uva1380 A Scheduling Problem
按紫书来注意这道题的题目给了很大的方便,就相当于验证k是不是答案,不是的话就是k+1 #include<iostream> #include<string> #include& ...
- UVA 1380 A Scheduling Problem
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVALive - 7041 G - The Problem to Slow Down You
题意:求两个串的公共回文子串个数 题解:建两个回文自动机,从0和1各跑一边就是答案了,因为对于回文自动机来说,从头开始dfs就能找出该字符串的所有回文串 //#pragma GCC optimize( ...
- 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 ...
随机推荐
- Shuffle Bags让你的随机不那么随机
前言 当我最初写游戏时,我经常使用标准Random()函数,然后写一堆if和else条件来我获得预期结果.如果结果不太好,我会写更多的条件进行过滤或者筛选,直到我觉得游戏变得有趣.最近我发现有更好的方 ...
- Python中的异常(Exception)处理
异常 当你的程序出现例外情况时就会发生异常(Exception).例如,当你想要读取一个文件时,而那个文件却不存在,怎么办?又或者你在程序执行时不小心把它删除了,怎么办?这些通过使用异常来进行处理. ...
- 我用Python远程探查室友的网页浏览记录,他不愧是成年人!
过程: 利用Python制作远程查看别人电脑的操作记录,与其它教程类似,都是通过邮件返回. 利用程序得到目标电脑浏览器当中的访问记录,生产一个文本并发送到你自己的邮箱,当然这个整个过程除了你把pyth ...
- yocto-sumo源码解析(十): ProcessServer.idle_commands
这一节开始介绍ProcessServer.idle_commands,前面我们知道ProcessServer.main就是不停调用idle_commands()以获取可用的套接字描述符或者是文件描述符 ...
- 基于WebSocket协议的性能测试
互联网应用时代,用户获取信息的方式从传统媒体到新媒体,信息时效性对通信技术要求越来越高, HTTP协议已经不能适用.于是WebSocket出现了,它实现浏览器与服务器的全双工通信,服务端主动向客户端发 ...
- python-python爬取豆果网(菜谱信息)
#-*- coding = utf-8 -*- #获取豆果网图片 import io from bs4 import BeautifulSoup import requests #爬取菜谱的地址 ur ...
- MariaDB远程连接问题
MariaDB在设置完通过Navicat Premium远程连接账号验证通过,但是无法正常使用工具的功能,只能使用sql语句查询,但是通过控制台命令功能正常. 经过修改账号权限,添加新用户等功能都无法 ...
- 查看linux端口对应的进程id
例如:查看占用4040端口的进程 ss -lptn 'sport = :4040'
- alias命令详情
基础命令学习目录首页 原文链接:http://c.biancheng.net/view/938.html 给命令设置别名,你可以把它当作命令的"小名",但是这样做有什么意义呢? 比 ...
- XSS攻击防御篇
前言 上篇文章中提到了 XSS 攻击,而且,也从几个方面介绍了 XSS 攻击带来的严重影响.那么,这篇文章中,主要是针对 XSS 攻击做一个基本的防御,看看可以通过几种方式来修复这个特别常见的安全 ...