我自己yy了个贪心算法,在某oj 0msAC~。然后去wikioi提交,呵呵,原来是之前oj的数据太弱给我水过了,我晕。

我之前的想法是在这棵树上维护sum,然后按时间来割边,每一时刻割已经感染的人所连接的sum值最大的边。,,才60分。。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <string>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8. #define rep(i, n) for(int i=0; i<(n); ++i)
  9. #define for1(i,a,n) for(int i=(a);i<=(n);++i)
  10. #define for2(i,a,n) for(int i=(a);i<(n);++i)
  11. #define for3(i,a,n) for(int i=(a);i>=(n);--i)
  12. #define for4(i,a,n) for(int i=(a);i>(n);--i)
  13. #define CC(i,a) memset(i,a,sizeof(i))
  14. #define max(a,b) ((a)>(b)?(a):(b))
  15. #define min(a,b) ((a)<(b)?(a):(b))
  16. #define read(a) a=getnum()
  17. #define print(a) printf("%d", a)
  18. #define debug(x) printf("debug: %d\n", x)
  19. #define printarr(a, x) { for1(i, 0, x) printf("%d ", a[i]); printf("\n"); }
  20. 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; }
  21.  
  22. const int N=305;
  23. int ihead[N], inext[N*N], to[N*N], cnt, sum[N], n, m, fa[N];
  24. bool vis[N], die[N], vis2[N];
  25.  
  26. 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]]; }
  27. inline void add(int u, int v) {
  28. inext[++cnt]=ihead[u]; ihead[u]=cnt; to[cnt]=v;
  29. inext[++cnt]=ihead[v]; ihead[v]=cnt; to[cnt]=u;
  30. }
  31.  
  32. void build(const int &x) {
  33. if(vis[x]) return; vis[x]=true;
  34. for(int i=ihead[x]; i; i=inext[i]) if(!vis[to[i]]) fa[to[i]]=x, build(to[i]);
  35. pushup(x);
  36. }
  37.  
  38. int main() {
  39. bool flag;
  40. int maxi, v, ans=0;
  41. read(n); read(m);
  42. rep(i, m) add(getnum(), getnum());
  43. build(1);
  44. CC(vis, 0);
  45. vis[1]=die[1]=true;
  46. int fff=sum[1];
  47. for1(ttt, 1, fff) {
  48. flag=1; maxi=0;
  49. memcpy(vis2, vis, sizeof(vis));
  50. for1(u, 1, n) if(vis2[u]) {
  51. for(int i=ihead[u]; i; i=inext[i]) if(to[i]!=fa[u] && !vis[v=to[i]]) {
  52. die[v]=1;
  53. flag=0;
  54. if(sum[v]>sum[maxi]) maxi=v;
  55. vis[v]=true;
  56. }
  57. vis[u]=vis[maxi]=die[maxi]=false;
  58. }
  59. if(flag) break;
  60. }
  61. for1(i, 1, n) if(die[i]) ans++;
  62. print(ans);
  63. return 0;
  64. }

好吧,看题解。。

恩,,,深搜,因为贪心那个建图的话,不能处理环 囧。

(或许某天yy出处理环的贪心0.0)

(不行,我得思考一下我的贪心,好像似乎可行。

先放出我后边写的dfs。。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cmath>
  4. #include <string>
  5. #include <iostream>
  6. #include <algorithm>
  7. using namespace std;
  8. #define rep(i, n) for(int i=0; i<(n); ++i)
  9. #define for1(i,a,n) for(int i=(a);i<=(n);++i)
  10. #define for2(i,a,n) for(int i=(a);i<(n);++i)
  11. #define for3(i,a,n) for(int i=(a);i>=(n);--i)
  12. #define for4(i,a,n) for(int i=(a);i>(n);--i)
  13. #define CC(i,a) memset(i,a,sizeof(i))
  14. #define max(a,b) ((a)>(b)?(a):(b))
  15. #define min(a,b) ((a)<(b)?(a):(b))
  16. #define read(a) a=getnum()
  17. #define print(a) printf("%d", a)
  18. #define debug(x) printf("debug: %d\n", x)
  19. #define printarr(a, x) { for1(i, 0, x) printf("%d ", a[i]); printf("\n"); }
  20. 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; }
  21.  
  22. const int N=305;
  23. int ihead[N], inext[N*N], to[N*N], fa[N], d[N], cnt, n, m, ans=~0u>>1;
  24. bool die[N], vis[N];
  25.  
  26. inline void add(int u, int v) {
  27. inext[++cnt]=ihead[u]; ihead[u]=cnt; to[cnt]=v;
  28. inext[++cnt]=ihead[v]; ihead[v]=cnt; to[cnt]=u;
  29. }
  30.  
  31. void build(const int &x) {
  32. if(vis[x]) return; vis[x]=true;
  33. for(int i=ihead[x]; i; i=inext[i]) if(!vis[to[i]]) {
  34. fa[to[i]]=x; d[to[i]]=d[x]+1;
  35. build(to[i]);
  36. }
  37. }
  38.  
  39. void dfs(const int &dis, int num) {
  40. if(num>=ans) return;
  41. bool flag=1;
  42. for1(u, 1, n) if(d[u]==dis && die[u])
  43. for(int i=ihead[u]; i; i=inext[i])
  44. if(fa[to[i]]==u) flag=0, die[to[i]]=1, ++num;
  45. --num;
  46. for1(u, 1, n) if(d[u]==dis+1 && die[u]) die[u]=0, dfs(dis+1, num), die[u]=1;
  47. ++num;
  48. for1(u, 1, n) if(d[u]==dis && die[u])
  49. for(int i=ihead[u]; i; i=inext[i])
  50. if(fa[to[i]]==u) die[to[i]]=0, --num;
  51. if(flag && ans>num) ans=num;
  52. }
  53.  
  54. int main() {
  55. read(n); read(m);
  56. rep(i, m) add(getnum(), getnum());
  57. die[1]=true; d[1]=1;
  58. build(1);
  59. dfs(1, 1);
  60. print(ans);
  61. return 0;
  62. }

【NOIP2003】传染病控制(-贪心/dfs)的更多相关文章

  1. [NOIP2003] 传染病控制题解

    问题 F: [NOIP2003] 传染病控制 时间限制: 1 Sec  内存限制: 128 MB 题目描述 [问题背景] 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范 ...

  2. 小黑的镇魂曲(HDU2155:贪心+dfs+奇葩解法)

    题目:点这里 题目的意思跟所谓的是英雄就下100层一个意思……在T秒内能够下到地面,就可以了(还有一个板与板之间不能超过H高). 接触这题目是在昨晚的训练赛,当时拍拍地打了个贪心+dfs,果断跟我想的 ...

  3. 【bzoj3252】攻略 贪心+DFS序+线段树

    题目描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏. 今天他得到了一款新游戏<XX半岛>,这款游戏有n个场景(scene),某 ...

  4. hdu6060[贪心+dfs] 2017多校3

    /* hdu6060[贪心+dfs] 2017多校3*/ #include <bits/stdc++.h> using namespace std; typedef long long L ...

  5. NOIP2003传染病控制[按层DFS]

    题目背景 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完全认识这种传染病,难以准确判别病毒携带 ...

  6. NOIP2003 传染病控制

    题四     传染病控制 [问题背景] 近来,一种新的传染病肆虐全球.蓬莱国也发现了零星感染者,为防止该病在蓬莱国 大范围流行,该国政府决定不惜一切代价控制传染病的蔓延.不幸的是,由于人们尚未完 全认 ...

  7. UVALive3902 Network[贪心 DFS&&BFS]

    UVALive - 3902 Network Consider a tree network with n nodes where the internal nodes correspond to s ...

  8. HDU 5802 Windows 10 (贪心+dfs)

    Windows 10 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5802 Description Long long ago, there was ...

  9. Cut 'em all! CodeForces - 982C(贪心dfs)

    K - Cut 'em all! CodeForces - 982C 给一棵树 求最多能切几条边使剩下的子树都有偶数个节点 如果n是奇数 那么奇数=偶数+奇数 不管怎么切 都会有奇数 直接打印-1 贪 ...

随机推荐

  1. &&队友最近一周水水

    100130 练习5 5 hr ago 15.2 days Private qwerqqq 100093 DP2 16 hr ago 50.2 days Private qwerqqq 100092 ...

  2. XmlWriter/XmlReader示例代码

    在Silverlight项目中,如果您想最大程度的减少xap包的大小,仅使用默认System.Xml命名空间下提供的功能来实现“XML序列化/反序列化”,恐怕XmlReader/XmlWriter将成 ...

  3. XShell上传下载命令

    参考:https://www.centos.bz/2012/12/xshell-securecrtrz-sz-upload-download/ 上传文件时,执行rz就会弹出文件选择对话框来选择文件.下 ...

  4. Android 转载一篇.9图片详解文章

    感谢作者,原文链接为 http://blog.csdn.net/ouyang_peng/article/details/9242889

  5. 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 ...

  6. Greedy:Yogurt factory(POJ 2393)

    酸奶工厂 题目大意:酸奶工厂每个星期都要制造酸奶,成本每单位x,然后每个星期要生产y,然后酸奶厂有个巨大的储存室,可以无限储存酸奶,而且酸奶的品质不会变坏,每天储存要每单位花费S,求最小的成本. 简直 ...

  7. jquery去掉或者替换字符,设置指定options为selected状态

    <html> <body> <div><select id="queryYear">                 <opt ...

  8. WINDOWS xp用户账户怎么没了怎么办?

    这是因为系统的一个默认设置!新建用户会把管理员用户隐藏!只是修改了里面的注册表!在运行(windows徽标+R)里输入“regedit”可以打开注册表编辑器,定位到“HKEY_LOCAL_MACHIN ...

  9. 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 ...

  10. mysql修改表的存储引擎(myisam<=>innodb)

    查看当前数据库的所支持的数据库引擎以及默认数据库引擎 mysql> show engines; +--------------------+---------+----------------- ...