HDU 5438拓扑+bfs或者dfs
来源:互联网 发布:英雄联盟t恤淘宝 编辑:程序博客网 时间:2024/05/16 12:11
HDU 5438
题意:
有个人有p个池塘,每一个池塘有其价值,池塘之间有连接的管道,现在主人由于资金的问题,需要抛弃一些池塘,其特点是与之相邻的池塘只有一个,当然如果删除了一个池塘之后剩下的池塘仍然有类似的池塘还要接着删除。
删除之后,问连通图中池塘的个数为奇数个的连通图所有池塘的价值和。
思路:
记录每一个池塘所连接的边,其实也就是入度,此题的边是双向的,所以直接记录即可。
然后不停的循环删除入度只有0或者1的点,最多删除p次。
删除之后就是查找剩下的点的价值和,对于不同的连通图直接用bfs找出所有即可,这里可以也用dfs。
#include <iostream>#include <cstdio>#include <cstring>#include <vector>#include <queue>using namespace std;const int maxn = 1e5+10;typedef long long LL;int t,p,m;int val[maxn];int topsort[maxn],vis[maxn];vector<int>G[10005];/*LL bfs(int u){ queue<int>q; LL sum = val[u]; int num = 1; vis[u] = true; q.push(u); while(!q.empty()) { int to = q.front(); q.pop(); int Size = G[to].size(); for(int i = 0;i < Size; i++) { if(topsort[G[to][i]] >= 2 && !vis[G[to][i]]) { vis[G[to][i]] = true; sum += val[G[to][i]]; num++; q.push(G[to][i]); } } } if(num >= 3 && num%2) return sum; return 0;}*/LL sum;int num;void dfs(int u){ num++; sum += val[u]; vis[u] = true; int Size = G[u].size(); for(int i = 0;i < Size; i++) { int to = G[u][i]; if(!vis[to] && topsort[to] >= 2) { dfs(to); } }}int main(){// freopen("in.txt","r",stdin); scanf("%d",&t); while(t--) { scanf("%d%d",&p,&m); for(int i = 1;i <= p; i++) G[i].clear(); for(int i = 1;i <= p; i++) { scanf("%d",&val[i]); topsort[i] = 0; vis[i] = 0; } for(int i = 1;i <= m; i++) { int u,v; scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); topsort[u]++; topsort[v]++; } for(int i = 1;i <= p; i++) { int j; for(j = 1;j <= p; j++) { if(topsort[j] == 0 || topsort[j] == 1) break; } if(j > p) break; int Size = G[j].size(); topsort[j] = -1; for(int k = 0;k < Size; k++) { topsort[G[j][k]]--; } } LL ans = 0; for(int i = 1;i <= p; i++) { if(topsort[i] >= 2 && !vis[i]) { sum = 0; num = 0; //ans += bfs(i); dfs(i); ans += (num >= 3 && num%2)? sum : 0; } } printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- HDU 5438拓扑+bfs或者dfs
- HDU 1728逃离迷宫(DFS或者BFS)
- HDU 1728逃离迷宫(DFS或者BFS)
- hdu 5438(拓扑+bfs)
- UVA10557SPFA或者bfs+dfs
- HDU 1175 连连看 (BFS 或者 DFS)
- HDU 1241 Oil Deposits (基础DFS 或者 BFS)
- hdu-2102A计划(两层地图 bfs或者dfs)
- UVA1423Guess (dfs,bfs拓扑排序)
- 拓扑排序(BFS,DFS)
- hdu 5438 Ponds(拓扑应用、DFS)
- HDU 5438 Ponds(拓扑排序 + DFS)
- HDU 5438 --Ponds【拓扑排序 && DFS】
- hdu 5438 Ponds(拓扑排序+dfs)
- HDU 5438 Ponds(拓扑排序+dfs)
- hdu 5438 Ponds 拓扑序+简单dfs
- HDU 1983 BFS + DFS
- HDU 1044 BFS + DFS
- C++多态实现之虚函数列表.
- 第十四周作业:Java集合框架上机练习题
- priority_queue用法
- 12月学习计划
- spark shell启动警告 Unable to load native-hadoop library for your platform
- HDU 5438拓扑+bfs或者dfs
- 自己实践
- RNG随机类
- PAT Basic 1028
- MySQL的binlog日志
- 字典序(头条校招java)
- Windows免安装版 zip包 安装 配置教程 noinstall版
- ~!北京赛車五六码走势技巧~@#%
- Programming dynamic ALV in WebDynpro for ABAP