社区讨论
90分求助
P1041[NOIP 2003 提高组] 传染病控制(疑似错题)参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @lo2b1nat
- 此快照首次捕获于
- 2023/10/23 10:55 2 年前
- 此快照最后确认于
- 2023/10/23 10:55 2 年前
思路:通过dfs计算所有节点的子节点个数s[i],和深度d[i],通过迭代加深枚举深度为i的所有未标记不会感染的节点,把s[i]最大的节点标记,并通过dfs标记其所有子节点,最后统计未标记的节点个数,预处理时间复杂度O(n)枚举过程的时间复杂度O(n)(常数在2左右)统计时使用bitset,时间复杂度O(n)常数是32分之1,由于n的上界是300,这一步的时间复杂度接近O(1),总时间复杂度O(n)
可以通过样例,第9 组数据(我会放在最后)错误
程序如下:
CPP#include <bits/stdc++.h>
using namespace std;
#define void inline void
const unsigned short N=305;
vector<unsigned short>a[N],dep[N];
unsigned short d[N],s[N],fa[N];
#define int register unsigned short
void dfs(int u,int f){s[u]=1;
for(int i=0;i<a[u].size();i++){
int v=a[u][i];if(v==f){fa[u]=v;continue;}
d[v]=d[u]+1;dfs(v,u);s[u]+=s[v];
}}short u,v,ans=1;bitset<N>vis;
#define add a[u].push_back(v);a[v].push_back(u);
void dfs2(int u){for(int i=0;i<a[u].size();i++){
int v=a[u][i];if(v==fa[u])continue;vis.set(v);dfs2(v);}}
signed main(){ios::sync_with_stdio(false);int n,p;cin>>n>>p;
while(p--){cin>>u>>v;add;}dfs(1,1);
for(int i=2;i<=n;i++)dep[d[i]].push_back(i);
for(int i=1;i<=n;i++){int ma=0,id;
for(int j=0;j<dep[i].size();j++)ma<s[dep[i][j]]&&!vis.test(dep[i][j])?
ma=s[dep[i][j]],id=dep[i][j]:0;if(!ma)break;vis.set(id);dfs2(id);}//剪枝,如果不存在第i层,一定不存在i+1层
for(int i=2;i<=n;i++)ans+=!vis.test(i);cout<<ans;}
第9 组数据如下,期望输出55,实际输出56
CPP/*
100 99
2 1
3 2
4 3
5 3
6 3
7 2
8 7
9 7
10 9
11 7
12 2
13 12
14 12
15 12
16 2
17 16
18 17
19 17
20 16
21 2
22 21
23 21
24 21
25 1
26 25
27 26
28 25
29 28
30 25
31 30
32 31
33 31
34 31
35 30
36 35
37 35
38 37
39 37
40 1
41 40
42 41
43 41
44 41
45 41
46 40
47 46
48 40
49 40
50 49
51 40
52 51
53 51
54 40
55 54
56 54
57 1
58 57
59 58
60 58
61 58
62 57
63 62
64 62
65 62
66 57
67 66
68 66
69 66
70 66
71 57
72 71
73 71
74 71
75 74
76 57
77 76
78 76
79 76
80 76
81 1
82 81
83 82
84 83
85 82
86 85
87 81
88 87
89 88
90 88
91 87
92 87
93 92
94 92
95 94
96 92
97 96
98 96
99 92
100 99
改了很长时间了,希望各位大神帮助orz
回复
共 1 条回复,欢迎继续交流。
正在加载回复...