【NOIP2003】传染病控制(-贪心/dfs)
我自己yy了个贪心算法,在某oj 0msAC~。然后去wikioi提交,呵呵,原来是之前oj的数据太弱给我水过了,我晕。
我之前的想法是在这棵树上维护sum,然后按时间来割边,每一时刻割已经感染的人所连接的sum值最大的边。,,才60分。。
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <string>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- #define rep(i, n) for(int i=0; i<(n); ++i)
- #define for1(i,a,n) for(int i=(a);i<=(n);++i)
- #define for2(i,a,n) for(int i=(a);i<(n);++i)
- #define for3(i,a,n) for(int i=(a);i>=(n);--i)
- #define for4(i,a,n) for(int i=(a);i>(n);--i)
- #define CC(i,a) memset(i,a,sizeof(i))
- #define max(a,b) ((a)>(b)?(a):(b))
- #define min(a,b) ((a)<(b)?(a):(b))
- #define read(a) a=getnum()
- #define print(a) printf("%d", a)
- #define debug(x) printf("debug: %d\n", x)
- #define printarr(a, x) { for1(i, 0, x) printf("%d ", a[i]); printf("\n"); }
- inline int getnum() { int ret=0; char c; int k=1; for(c=getchar(); c<'0' || c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0' && c<='9'; c=getchar()) ret=ret*10+c-'0'; return ret*k; }
- const int N=305;
- int ihead[N], inext[N*N], to[N*N], cnt, sum[N], n, m, fa[N];
- bool vis[N], die[N], vis2[N];
- inline void pushup(int x) { sum[x]=1; for(int i=ihead[x]; i; i=inext[i]) if(to[i]!=fa[x]) sum[x]+=sum[to[i]]; }
- inline void add(int u, int v) {
- inext[++cnt]=ihead[u]; ihead[u]=cnt; to[cnt]=v;
- inext[++cnt]=ihead[v]; ihead[v]=cnt; to[cnt]=u;
- }
- void build(const int &x) {
- if(vis[x]) return; vis[x]=true;
- for(int i=ihead[x]; i; i=inext[i]) if(!vis[to[i]]) fa[to[i]]=x, build(to[i]);
- pushup(x);
- }
- int main() {
- bool flag;
- int maxi, v, ans=0;
- read(n); read(m);
- rep(i, m) add(getnum(), getnum());
- build(1);
- CC(vis, 0);
- vis[1]=die[1]=true;
- int fff=sum[1];
- for1(ttt, 1, fff) {
- flag=1; maxi=0;
- memcpy(vis2, vis, sizeof(vis));
- for1(u, 1, n) if(vis2[u]) {
- for(int i=ihead[u]; i; i=inext[i]) if(to[i]!=fa[u] && !vis[v=to[i]]) {
- die[v]=1;
- flag=0;
- if(sum[v]>sum[maxi]) maxi=v;
- vis[v]=true;
- }
- vis[u]=vis[maxi]=die[maxi]=false;
- }
- if(flag) break;
- }
- for1(i, 1, n) if(die[i]) ans++;
- print(ans);
- return 0;
- }
好吧,看题解。。
恩,,,深搜,因为贪心那个建图的话,不能处理环 囧。
(或许某天yy出处理环的贪心0.0)
(不行,我得思考一下我的贪心,好像似乎可行。
先放出我后边写的dfs。。
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <string>
- #include <iostream>
- #include <algorithm>
- using namespace std;
- #define rep(i, n) for(int i=0; i<(n); ++i)
- #define for1(i,a,n) for(int i=(a);i<=(n);++i)
- #define for2(i,a,n) for(int i=(a);i<(n);++i)
- #define for3(i,a,n) for(int i=(a);i>=(n);--i)
- #define for4(i,a,n) for(int i=(a);i>(n);--i)
- #define CC(i,a) memset(i,a,sizeof(i))
- #define max(a,b) ((a)>(b)?(a):(b))
- #define min(a,b) ((a)<(b)?(a):(b))
- #define read(a) a=getnum()
- #define print(a) printf("%d", a)
- #define debug(x) printf("debug: %d\n", x)
- #define printarr(a, x) { for1(i, 0, x) printf("%d ", a[i]); printf("\n"); }
- inline int getnum() { int ret=0; char c; int k=1; for(c=getchar(); c<'0' || c>'9'; c=getchar()) if(c=='-') k=-1; for(; c>='0' && c<='9'; c=getchar()) ret=ret*10+c-'0'; return ret*k; }
- const int N=305;
- int ihead[N], inext[N*N], to[N*N], fa[N], d[N], cnt, n, m, ans=~0u>>1;
- bool die[N], vis[N];
- inline void add(int u, int v) {
- inext[++cnt]=ihead[u]; ihead[u]=cnt; to[cnt]=v;
- inext[++cnt]=ihead[v]; ihead[v]=cnt; to[cnt]=u;
- }
- void build(const int &x) {
- if(vis[x]) return; vis[x]=true;
- for(int i=ihead[x]; i; i=inext[i]) if(!vis[to[i]]) {
- fa[to[i]]=x; d[to[i]]=d[x]+1;
- build(to[i]);
- }
- }
- void dfs(const int &dis, int num) {
- if(num>=ans) return;
- bool flag=1;
- for1(u, 1, n) if(d[u]==dis && die[u])
- for(int i=ihead[u]; i; i=inext[i])
- if(fa[to[i]]==u) flag=0, die[to[i]]=1, ++num;
- --num;
- for1(u, 1, n) if(d[u]==dis+1 && die[u]) die[u]=0, dfs(dis+1, num), die[u]=1;
- ++num;
- for1(u, 1, n) if(d[u]==dis && die[u])
- for(int i=ihead[u]; i; i=inext[i])
- if(fa[to[i]]==u) die[to[i]]=0, --num;
- if(flag && ans>num) ans=num;
- }
- int main() {
- read(n); read(m);
- rep(i, m) add(getnum(), getnum());
- die[1]=true; d[1]=1;
- build(1);
- dfs(1, 1);
- print(ans);
- return 0;
- }
【NOIP2003】传染病控制(-贪心/dfs)的更多相关文章
- [NOIP2003] 传染病控制题解
问题 F: [NOIP2003] 传染病控制 时间限制: 1 Sec 内存限制: 128 MB 题目描述 [问题背景] 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范 ...
- 小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)
题目:点这里 题目的意思跟所谓的是英雄就下100层一个意思……在T秒内能够下到地面,就可以了(还有一个板与板之间不能超过H高). 接触这题目是在昨晚的训练赛,当时拍拍地打了个贪心+dfs,果断跟我想的 ...
- 【bzoj3252】攻略 贪心+DFS序+线段树
题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(scene),某 ...
- hdu6060[贪心+dfs] 2017多校3
/* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...
- NOIP2003传染病控制[按层DFS]
题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...
- NOIP2003 传染病控制
题四 传染病控制 [问题背景] 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国 大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完 全认 ...
- UVALive3902 Network[贪心 DFS&&BFS]
UVALive - 3902 Network Consider a tree network with n nodes where the internal nodes correspond to s ...
- HDU 5802 Windows 10 (贪心+dfs)
Windows 10 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5802 Description Long long ago, there was ...
- Cut 'em all! CodeForces - 982C(贪心dfs)
K - Cut 'em all! CodeForces - 982C 给一棵树 求最多能切几条边使剩下的子树都有偶数个节点 如果n是奇数 那么奇数=偶数+奇数 不管怎么切 都会有奇数 直接打印-1 贪 ...
随机推荐
- &&队友最近一周水水
100130 练习5 5 hr ago 15.2 days Private qwerqqq 100093 DP2 16 hr ago 50.2 days Private qwerqqq 100092 ...
- XmlWriter/XmlReader示例代码
在Silverlight项目中,如果您想最大程度的减少xap包的大小,仅使用默认System.Xml命名空间下提供的功能来实现“XML序列化/反序列化”,恐怕XmlReader/XmlWriter将成 ...
- XShell上传下载命令
参考:https://www.centos.bz/2012/12/xshell-securecrtrz-sz-upload-download/ 上传文件时,执行rz就会弹出文件选择对话框来选择文件.下 ...
- Android 转载一篇.9图片详解文章
感谢作者,原文链接为 http://blog.csdn.net/ouyang_peng/article/details/9242889
- Java for LeetCode 154 Find Minimum in Rotated Sorted Array II
Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 migh ...
- Greedy:Yogurt factory(POJ 2393)
酸奶工厂 题目大意:酸奶工厂每个星期都要制造酸奶,成本每单位x,然后每个星期要生产y,然后酸奶厂有个巨大的储存室,可以无限储存酸奶,而且酸奶的品质不会变坏,每天储存要每单位花费S,求最小的成本. 简直 ...
- jquery去掉或者替换字符,设置指定options为selected状态
<html> <body> <div><select id="queryYear"> <opt ...
- WINDOWS xp用户账户怎么没了怎么办?
这是因为系统的一个默认设置!新建用户会把管理员用户隐藏!只是修改了里面的注册表!在运行(windows徽标+R)里输入“regedit”可以打开注册表编辑器,定位到“HKEY_LOCAL_MACHIN ...
- Rap 安装和配置
本机环境 系统:CentOS 6.7 64 位 MySQL 5.6 JDK 1.8 Tomcat 8 Redis 3.0.7 Rap 0.14.1 Rap 说明 官网:https://github.c ...
- mysql修改表的存储引擎(myisam<=>innodb)
查看当前数据库的所支持的数据库引擎以及默认数据库引擎 mysql> show engines; +--------------------+---------+----------------- ...