hdu 6178 Monkeys dfs匹配
来源:互联网 发布:java microservice 编辑:程序博客网 时间:2024/05/16 19:50
题意:在一个树上,把n个猴子放到k个位置,求最小的边数;
思路:求二分匹配最小顶点覆盖。范围较大,可以dfs从叶子节点往根节点选(贪心)。
由于读入很大,普通挂也T, 必须用fread
#include <iostream>#include <cstring>#include <algorithm>#include <cstdio>#define scan(n) FastIO::read(n)using namespace std;namespace FastIO { const int SIZE = 1 << 16; char buf[SIZE], obuf[SIZE], str[60]; int bi = SIZE, bn = SIZE, opt; int read(char *s) { while (bn) { for (; bi < bn && buf[bi] <= ' '; bi++); if (bi < bn) break; bn = fread(buf, 1, SIZE, stdin); bi = 0; } int sn = 0; while (bn) { for (; bi < bn && buf[bi] > ' '; bi++) s[sn++] = buf[bi]; if (bi < bn) break; bn = fread(buf, 1, SIZE, stdin); bi = 0; } s[sn] = 0; return sn; } bool read(int& x) { int n = read(str), bf; if (!n) return 0; int i = 0; if (str[i] == '-') bf = -1, i++; else bf = 1; for (x = 0; i < n; i++) x = x * 10 + str[i] - '0'; if (bf < 0) x = -x; return 1; }};const int MAXN=200005;int head[MAXN];int sum,cnt;struct node{ int to, from;}G[MAXN];void add(int u, int v){ G[cnt].to=v; G[cnt].from=head[u]; head[u]=cnt++;}int dfs(int u, int fa){ int flag=0;//若为叶子节点,则回溯后,sum+=1; for(int i=head[u];~i;i=G[i].from) { int v=G[i].to; if(v==fa) continue; if(!dfs(v, u)) flag=1; } sum+=flag; return flag;}int main(){ int n, k; int t; scan(t); while(t--) { scan(n); scan(k); int x; memset(head, -1, sizeof(head)); cnt=0; for(int i=1;i<n;++i) { scan(x); add(i+1, x); add(x,i+1); } sum=0; dfs(1, 0); int ans; if(k<=sum*2) ans=(k+1)/2; else ans=k-sum; cout<<ans<<endl; } return 0;}
自己之前一直wrong的代码,终于对了。
#include <bits/stdc++.h>using namespace std;const int MAXN=100005;namespace IN{const int inBufferSize = 1<<25;char inBuffer[inBufferSize];char *inHead = NULL, *inTail = NULL;inline char Getchar(){ if(inHead == inTail) inTail=(inHead=inBuffer)+fread(inBuffer, 1, inBufferSize, stdin); return *inHead++;}}#define getchar() IN::Getchar()template <typename T>inline void scan_ud(T &ret){ char c = getchar(); ret = 0; while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') ret = ret * 10 + (c - '0'), c = getchar();}bool vis[MAXN];vector <int> G[MAXN];int m, ans;void dfs(int x, int pre){ for(int i=0; i<G[x].size(); ++i) { if(!vis[G[x][i]]&&G[x][i]!=pre) dfs(G[x][i], x); } if(m==0||m==1) return; if(!vis[pre]&&!vis[x]) { vis[pre]=vis[x]=true; ans++; m-=2; return ; }}int main(){ int t; scanf("%d", &t); while(t--) { int n; scan_ud(n); scan_ud(m); int x; ans=0; memset(vis, false, sizeof(vis)); //memset(use, false, sizeof(use)); for(int i=1; i<=n; ++i) G[i].clear(); for(int i=1; i<=n-1; ++i) { scan_ud(x); G[x].push_back(i+1); G[i+1].push_back(x); }// for(int i=1;i<=n;++i)// printf("%d\n", G[i].size()); vis[0]=true; dfs(n, 0); printf("%d\n", ans+m); } return 0;}
阅读全文
0 0
- hdu 6178 Monkeys dfs匹配
- hdu 6178 Monkeys (dfs+FastIO)
- HDU 6178 Monkeys【DFS+输入输出外挂】
- HDU 6178 Monkeys【dfs】【输入外挂模板】
- HDU 6178 && 2017 多校训练:Monkeys(DFS)
- HDU 6178 Monkeys(树上的二分匹配+fread)
- hdu 6178 Monkeys
- HDU-6178 Monkeys
- hdu 6178 Monkeys 贪心
- hdu-6178-Monkeys(fast IO)
- hdu 6178 Monkeys (贪心)
- 【多校训练】hdu 6178 Monkeys 贪心+dfs+读入挂模版
- HDU 6178 Monkeys (贪心+输入挂)
- HDU6178 Monkeys【DFS】
- Hdu 6178 Monkeys【树形Dp-最小点覆盖+贪心思维】
- HDU 6178 Monkeys(树上DP 17多校第十场)
- hdu 1045 dfs 二分匹配
- hdu 2444 二分图匹配 + dfs染色
- BZOJ 1011 数学 解题报告
- 一个有用的pom文件
- Windows下安装matplotlib
- 一句话说明白Java线程池中shutdown和shutdownNow的区别
- [树上启发式合并 && 哈希] Codeforces 741D. Arpa’s letter-marked tree and Mehrdad’s Dokhtar-kosh paths
- hdu 6178 Monkeys dfs匹配
- 第五章 数组与字符串 5.1 数组
- 矩阵、向量求导法则
- JavaWeb JSP 9个隐含对象
- Spring Web:Java 替代 web.xml 原理
- UVA 1609 Foul Play
- JDK1.7之下的inern用法
- (十七)SVG 实例-可交互式中国地图
- SuperSocket基础二