博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NOIP2003 传染病控制
阅读量:7196 次
发布时间:2019-06-29

本文共 2582 字,大约阅读时间需要 8 分钟。

一道答题解法一定细节解法并不怎么确定的题目,总体上就是搜索了。在每层当前可被感染的人中,只能选一个人,就先DFS建树,统计每一层的人,保存在一个表里,再进行搜索,一个人被控制后,就用递归把他的儿子全部赋值成不能染病,并在可染病人数中减去该子树大小,取最小值即可。

统计官方上都说要剪枝,但是我的程序最大点0.2S。

View Code
1  program noip2003t4(input,output);  2  type  3     node=^link;  4     link=record  5         goal:longint;  6         next:node;  7     end;  8 var  9     l,tree:array[0..401] of node; 10     nodes:array[0..400,0..400] of longint; 11     answer:longint; 12     n,p,sum,maxdepth:longint; 13     can,v:array[0..400] of boolean; 14 procedure add(xx,yy:longint); 15 var 16     tt:node; 17 begin 18     new(tt); 19     tt^.next:=l[xx]; 20     tt^.goal:=yy; 21     l[xx]:=tt; 22 end;{
add } 23 procedure add_tree(xx,yy:longint); 24 var 25 tt:node; 26 begin 27 new(tt); 28 tt^.goal:=yy; 29 tt^.next:=tree[xx]; 30 tree[xx]:=tt; 31 end;{
add_tree } 32 procedure init; 33 var 34 i,xx,yy:longint; 35 begin 36 readln(n,p); 37 for i:=1 to n do 38 begin 39 l[i]:=nil; 40 tree[i]:=nil; 41 end; 42 for i:=1 to p do 43 begin 44 read(xx,yy); 45 add(xx,yy); 46 add(yy,xx); 47 end; 48 fillchar(nodes,sizeof(nodes),0); 49 end;{
init } 50 procedure build(now:longint); 51 var 52 t:node; 53 begin 54 v[now]:=true; 55 t:=l[now]; 56 while t<>nil do 57 begin 58 if not v[t^.goal] then 59 begin 60 add_tree(now,t^.goal); 61 build(t^.goal); 62 end; 63 t:=t^.next; 64 end; 65 end;{
build } 66 procedure calc(now,depth:longint); 67 var 68 t:node; 69 begin 70 if depth>maxdepth then 71 maxdepth:=depth; 72 inc(nodes[depth,0]); 73 nodes[depth,nodes[depth,0]]:=now; 74 t:=tree[now]; 75 while t<>nil do 76 begin 77 calc(t^.goal,depth+1); 78 t:=t^.next; 79 end; 80 end;{
calc } 81 function change(now:longint;flag:boolean):longint; 82 var 83 t:node; 84 begin 85 change:=1; 86 can[now]:=flag; 87 t:=tree[now]; 88 while t<>nil do 89 begin 90 change:=change+change(t^.goal,flag); 91 t:=t^.next; 92 end; 93 end;{
change } 94 function check(now:longint):boolean; 95 var 96 i:longint; 97 begin 98 for i:=1 to nodes[now,0] do 99 if can[nodes[now,i]] then100 exit(true);101 exit(false);102 end;{
check }103 procedure dfs(depth:longint);104 var105 i:longint;106 begin107 if depth=maxdepth+1 then108 begin109 if sum

转载于:https://www.cnblogs.com/neverforget/archive/2012/05/10/2493909.html

你可能感兴趣的文章
oc精简笔记
查看>>
python的多线程和守护线程
查看>>
traditional:true
查看>>
PS字体加粗的小方法、、
查看>>
构造水题 Codeforces Round #206 (Div. 2) A. Vasya and Digital Root
查看>>
友元程序集
查看>>
Mysql表编辑
查看>>
规定密码以字母开头只能包含字母、数字和下划线
查看>>
计数排序 + 线段树优化 --- Codeforces 558E : A Simple Task
查看>>
maven下载及安装
查看>>
svn安装
查看>>
catalog
查看>>
第1章 MATLAB概述
查看>>
检查是否存在工艺路线
查看>>
内存分配
查看>>
Codeforces Round #298 (Div. 2) D. Handshakes [贪心]
查看>>
gridview单元格中获取行索引。。。
查看>>
数据中约束条件
查看>>
jmeter查看结果树的响应数据乱码解决办法
查看>>
代码整洁之道——6、测试
查看>>