一本通 P1386 【打击犯罪】



O(n3)思路 :此题数据太水,n3就能卡过。暴力枚举1 ~ n,每次都重新将并查集初始化并且按题目输入将所有 >= k(1 <= k <= n)的点合并(及打击掉1 ~ k的犯罪团伙,他们不合并)。从1 ~ n枚举直到找到最小的k满足所有犯罪团伙中的最大的一个的危险程度不超过n / 2,直接输出k。

code :

 1 #include <bits/stdc++.h>
 2 #define INF 0x3f3f3f3f
 3 using namespace std;
 4 int n, fa[1001], size[1001], p[1001], q[1001][1001];//记录下输入数据
 5 inline int find(int x)//搜索
 6 {
 7     return x == fa[x] ? fa[x] : fa[x] = find(fa[x]);
 8 }
 9 inline void unity(int x, int y)//按秩合并 + 路径压缩
10 {
11     int r1 = find(x);
12     int r2 = find(y);
13     if(size[r1] < r2)
14     {
15         fa[r1] = r2;
16         size[r2] += size[r1];
17     }
18     else
19     {
20         fa[r2] = r1;
21         size[r1] += size[r2];
22     }
23     return;
24 }
25 inline void init(int x)
26 {
27     for(register int i = 1; i <= n; ++i)
28     {
29         fa[i] = i;
30         size[i] = 1;
31     }
32     for(register int i = x + 1; i <= n; ++i)//重新将没被打击掉的犯罪团伙之间的联系连接起来
33     {
34         for(register int j = 1; j <= p[i]; ++j)
35         {
36             if(q[i][j] > x && find(i) != find(q[i][j]))//被联系的犯罪团伙也得 > x
37             {
38                 unity(i, q[i][j]);
39             }
40         }
41     }
42     return;
43 }
44 inline int check()//判断犯罪团伙中最大的一个是否 > n / 2
45 {
46     for(register int i = 1; i <= n; ++i)
47     {
48         if(size[fa[i]] > n / 2)
49         {
50             return 0;
51         }
52     }
53     return 1;
54 }
55 signed main()
56 {
57     scanf("%d", &n);
58     for(register int i = 1; i <= n; ++i)
59     {
60         scanf("%d", &p[i]);
61         for(register int j = 1; j <= p[i]; ++j)
62         {
63             scanf("%d", &q[i][j]);
64         }
65     }
66     for(register int i = 0; i <= n; ++i)
67     {
68         init(i);//初始化
69         if(check())//判断
70         {
71             printf("%d", i);
72             return 0;
73         }
74     }
75     return 0;
76 } 

O(n2)正解思路 :我们发现每次都重新输入过于多余,可以倒着输入,判断犯罪团伙中最大的一个是否 > n / 2,直到犯罪团伙中最大的一个 > n / 2时,输出k(k从n ~ 1枚举),表示不打击掉k就不行了。

code :

 1 //和O(n ^ 3)的注释基本差不多
 2 #include <bits/stdc++.h>
 3 #define INF 0x3f3f3f3f
 4 using namespace std;
 5 int n, fa[1001], size[1001], p[1001], q[1001][1001];
 6 inline int find(int x)
 7 {
 8     return x == fa[x] ? fa[x] : fa[x] = find(fa[x]);
 9 }
10 inline void unity(int x, int y)
11 {
12     int r1 = find(x);
13     int r2 = find(y);
14     if(size[r1] < r2)
15     {
16         fa[r1] = r2;
17         size[r2] += size[r1];
18     }
19     else
20     {
21         fa[r2] = r1;
22         size[r1] += size[r2];
23     }
24     return;
25 }
26 inline void init(int x)
27 {
28     for(register int i = 1; i <= p[x]; ++i)
29     {
30         if(q[x][i] >= x && find(x) != find(q[x][i]))
31         {
32             unity(x, q[x][i]);
33         }
34     }
35     return;
36 }
37 inline int check()
38 {
39     for(register int i = 1; i <= n; ++i)
40     {
41         if(size[fa[i]] > n / 2)
42         {
43             return 0;
44         }
45     }
46     return 1;
47 }
48 signed main()
49 {
50     scanf("%d", &n);
51     for(register int i = 1; i <= n; ++i)
52     {
53         fa[i] = i;
54         size[i] = 1;
55     }
56     for(register int i = 1; i <= n; ++i)
57     {
58         scanf("%d", &p[i]);
59         for(register int j = 1; j <= p[i]; ++j)
60         {
61             scanf("%d", &q[i][j]);
62         }
63     }
64     for(register int i = n; i >= 1; --i)//倒着整
65     {
66         init(i);
67         if(!check())//如果不打击掉当前犯罪团伙就不行了
68         {
69             printf("%d", i);//最小打击值
70             return 0;
71         }
72     }
73     return 0;
74 } 

原文地址:https://www.cnblogs.com/qqq1112/p/12112885.html

时间: 2024-10-07 16:09:40

一本通 P1386 【打击犯罪】的相关文章

codevs 5971 打击犯罪

题目描述 Description 某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团,犯罪集团的危险程度唯一由集团内的犯罪团伙数量确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为n).现在当地警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过n/2.为达到

codevs 5971 打击犯罪 x

题目描述 Description 某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团,犯罪集团的危险程度唯一由集团内的犯罪团伙数量确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为n).现在当地警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过n/2.为达到

打击犯罪(black)

题目描述 题目描述 Description 某个地区有n(n<=1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1-n,他们有些团伙之间有直接联系,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团,犯罪集团的危险程度唯一由集团内的犯罪团伙数量确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为n).现在当地警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过n/

【题解】打击犯罪

题目描述 某个地区有n(n≤1000)个犯罪团伙,当地警方按照他们的危险程度由高到低给他们编号为1至n,他们有些团伙之间有直接联系,,但是任意两个团伙都可以通过直接或间接的方式联系,这样这里就形成了一个庞大的犯罪集团,犯罪集团的危险程度由集团内的犯罪团伙数量唯一确定,而与单个犯罪团伙的危险程度无关(该犯罪集团的危险程度为n).现在当地 警方希望花尽量少的时间(即打击掉尽量少的团伙),使得庞大的犯罪集团分离成若干个较小的集团,并且他们中最大的一个的危险程度不超过 n/2.为达到最好的效果,他们将按

&lt;wzoi449&gt;打击犯罪

#include <bits/stdc++.h> #define maxn 1005 #define ms(s) memset(s,0,sizeof(s)) #define in(x) scanf("%d",&x) using namespace std; int n,f[maxn],g[maxn][maxn]; int cnt[maxn]; int find(int a){ if(f[a]==a){ return a; } else { f[a]=find(f[a

一本通基础篇图论

1341 一笔画问题 1 #include <cstdio> 2 #include <algorithm> 3 #include <stack> 4 using namespace std; 5 const int MAXN = 110000,MAXM = 510000; 6 stack <int> stk; 7 int head[MAXN],ind[MAXN]; 8 int to[MAXM],nxt[MAXM],idx[MAXM]; 9 int cnt,n

chinacloud大数据新闻

2015年大数据发展八大趋势   (0 篇回复) “数据很丰满,信息很骨感”:Sight Machine想用大数据的方法,打碎两者间的屏障   (0 篇回复) 百度携大数据"圈地"证券业 "BAT"开启互联网金融新战场   (0 篇回复) 码农的春天到了?   (0 篇回复) 浪潮大数据一体机出招 装备科研“最强大脑”   (0 篇回复) 方物软件承担国家“核高基”重大专项研发   (2 篇回复) 2013互联网大会透露的热点与新趋势   (1 篇回复) 大数据从幕

网络黑色产业调查:职业黑客推动洗钱贩卖身份

网络黑色产业调查:职业黑客推动洗钱贩卖身份 原标题:网络黑色产业调查 1 导读 网络犯罪呈现产业链化,分工日趋明细.专业化黑色利益链条的出现,让交易.勾连的双方,可能无须相互认识或见面.社交软件成为网络犯罪的重要工具和阵地,在某些情况下,甚至影响社会稳定.威胁国家安全. 本报记者 王峰 北京报道 “简直是腹背受制”,黄安(化名)谈到2015年8月向公安机关报案的感受时说. 黄安是某航空公司机票销售部门的负责人.2015年7月31日开始,这家航空公司的网上销售机票B2B系统就开始遭受黑客攻击,攻击

提升大数据数据分析性能的方法及技术(一)

关于此文 最近在忙着准备校招的相关复习,所以也整理了一下上学期上课时候的学到的一些知识.刚好发现当时还写了一篇类似于文献综述性质的文章,就在这里贴出来.题材是关于大数据的,也是比较火热的一个话题,虽然现在接触的项目与大数据不太有关联,可能以后也不一定从事这方面的工作吧.就IT行业的研究成果来讲国外期刊无论是发表速度还是质量都是高于国内,所以参考的大部分都是当时最新在核心期刊上发表的论文,参考文献在最后一一列出.因为文章没有多少自己的创新点,仅仅是最新.最热技术或者分析的一个总结,所以放上来仅仅是