DFS/BFS+思维 HDOJ 5325 Crazy Bobo
2015-07-29 10:21
127 查看
题目传送门
BFS 标程做法
/* 题意:给一个树,节点上有权值,问最多能找出多少个点满足在树上是连通的并且按照权值排序后相邻的点 在树上的路径权值都小于这两个点 DFS/BFS+思维:按照权值的大小,从小的到大的连有向边,搜索最多连接点数即是答案。因为排序后,他们之间的路径, 可定都是从当前节点u连过去的,那么都是小于这两个节点的。DFS需手动加栈,BFS类似拓扑排序的思路 */ #pragma comment (linker, "/STACK:1024000000,1024000000") #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; const int MAXN = 5e5 + 10; const int INF = 0x3f3f3f3f; int w[MAXN]; int cnt[MAXN]; vector<int> G[MAXN]; int n; void DFS(int u) { cnt[u] = 1; for (int i=0; i<G[u].size (); ++i) { int v = G[u][i]; if (!cnt[v]) DFS (v); cnt[u] += cnt[v]; } } int main(void) { //HDOJ 5325 Crazy Bobo //freopen ("J.in", "r", stdin); while (scanf ("%d", &n) == 1) { for (int i=1; i<=n; ++i) scanf ("%d", &w[i]); for (int i=1; i<=n; ++i) G[i].clear (); for (int i=1; i<=n-1; ++i) { int u, v; scanf ("%d%d", &u, &v); if (w[u] < w[v]) G[u].push_back (v); else G[v].push_back (u); } memset (cnt, 0, sizeof (cnt)); for (int i=1; i<=n; ++i) { if (cnt[i]) continue; DFS (i); } int ans = 0; for (int i=1; i<=n; ++i) ans = max (ans, cnt[i]); printf ("%d\n", ans); } return 0; }
#include <cstdio> #include <cstring> #include <algorithm> #include <vector> #include <queue> using namespace std; const int MAXN = 5e5 + 10; const int INF = 0x3f3f3f3f; int w[MAXN]; int cnt[MAXN]; int deg[MAXN]; vector<int> G[MAXN]; int n; int BFS(void) { queue<int> Q; int ret = 0; for (int i=1; i<=n; ++i) cnt[i] = 1; for (int i=1; i<=n; ++i) { if (!deg[i]) Q.push (i); } while (!Q.empty ()) { int u = Q.front (); Q.pop (); ret = max (ret, cnt[u]); for (int i=0; i<G[u].size (); ++i) { int v = G[u][i]; cnt[v] += cnt[u]; if (!(--deg[v])) Q.push (v); } } return ret; } int main(void) { //freopen ("J.in", "r", stdin); while (scanf ("%d", &n) == 1) { for (int i=1; i<=n; ++i) scanf ("%d", &w[i]); for (int i=1; i<=n; ++i) G[i].clear (); memset (deg, 0, sizeof (deg)); for (int i=1; i<=n-1; ++i) { int u, v; scanf ("%d%d", &u, &v); if (w[u] < w[v]) swap (u, v); G[u].push_back (v); deg[v]++; } printf ("%d\n", BFS ()); } return 0; }
BFS 标程做法
相关文章推荐
- java_web学习(1)理解JavaBean
- char 类型
- 6月“.中国”域名总量净减2,124个 降幅增大82.32%
- JS中showModalDialog 详细使用
- ios网络学习------4 UIWebView的加载本地数据的三种方式
- iOS开发之UIImage等比缩放
- spring MVC
- 1017. Queueing at Bank (25)
- unique 函数 c++
- string - strrchr源码
- 3、决策树
- 点击按钮移除整个DIV
- 牡丹亭记题词
- 安卓系统存在重大漏洞 仅凭文字消息可入侵
- FZU 2150 Fire Game
- 基于SDP的提议/应答(offer/answer)模型简介
- tomcat 禁用不安全的http请求模式
- CMenu
- ObjectiveC开发教程--字符串的连接
- 谈谈作为一个菜B的培训感受