hdu5438(拓扑排序+dfs)
来源:互联网 发布:microsoft fix it win8 编辑:程序博客网 时间:2024/06/06 01:41
借鉴了两位大佬的博客:
https://www.cnblogs.com/cenariusxz/p/4806748.html
http://blog.csdn.net/ac_gibson/article/details/48437831
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5438
**题意:**p个顶点m条边的无向图,每个顶点有一个权值,现在要删除所有的叶子节点,重复此操作直至形成的“森林”中不存在叶子节点,然后找出森林中顶点个数为奇数的树的权值的和。
思路:模拟拓扑排序,每个点每连一条边,我让它的度数就加2,所有度数为2的点入队,然后把这些点所连的边删掉,即跟它相关联的点的度数减去2,继续把度数为2的点入队列,然后用dfs跑一遍就行了。
代码:
#include <iostream>#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>#include <algorithm>#include <queue>#include <vector>using namespace std;const int maxn =10000+5;int T,p,m,s[maxn],deg[maxn],flag[maxn],sum;long long ans,ans1;queue <int> q;vector <int> g[maxn];void dfs(int u){ int l=g[u].size(); sum++; ans1+=s[u]; flag[u]=1; for(int i=0; i<l; i++) { int v=g[u][i]; if(!flag[v]&°[v]>2) dfs(v); } return ;}int main(){ int a,b; scanf("%d",&T); while(T--) { ans=0; memset(deg,0,sizeof(deg)); memset(flag,0,sizeof(flag)); while(!q.empty()) q.pop(); scanf("%d%d",&p,&m); for(int i=1; i<=p; i++) { scanf("%d",&s[i]); g[i].clear(); } for(int i=0; i<m; i++) { scanf("%d%d",&a,&b); deg[a]+=2; deg[b]+=2; g[a].push_back(b); g[b].push_back(a); } for(int i=1; i<=p; i++) { if(deg[i]==2) { q.push(i); } } while(!q.empty()) { int u = q.front(),v; q.pop(); flag[u]=1; int l=g[u].size(); for(int i = 0; i < l; i++) { v=g[u][i]; if(flag[v]) continue; deg[v]-=2; if(deg[v]==2) q.push(v); } } for(int i=1; i<=p; i++) { if(!flag[i]&°[i]>2) { sum=0,ans1=0;//sum统计个数 ans1记录和 dfs(i); if(sum%2==1) ans+=ans1; } } printf("%lld\n",ans); } return 0;}
阅读全文
0 0
- hdu5438(拓扑排序+dfs)
- HDU5438拓扑排序删点加DFS
- hdu5438 dfs+拓扑排序+前向星
- HDU5438(2015长春网赛)——Ponds(拓扑排序+dfs)
- hdu5438 Ponds(并查集、拓扑排序)
- 拓扑排序+DFS(POJ1270)
- 拓扑排序(BFS,DFS)
- uva10305(拓扑排序dfs)
- 删边+DFS hdu5438 Ponds
- uva 196 Spreadsheet(拓扑排序+DFS)
- poj1270Following Orders(拓扑排序+dfs回溯)
- 拓扑排序(topological sort)DFS
- HDU 5438 Ponds(拓扑排序 + DFS)
- HDU 5438 Ponds(拓扑排序+dfs)
- POJ 1094 拓扑排序(dfs+删边)
- 拓扑排序+DFS
- poj1128 拓扑排序+DFS
- 拓扑排序-DFS
- 启动windows服务时出现“错误1053:服务没有及时响应启动或控制请求”的解决方法
- spark学习(二)之简单应用程序——词频统计
- AngularJS模糊查询
- Openstack基础架构和各组件的关系
- Javascript怎么比较两个数组是否相同?
- hdu5438(拓扑排序+dfs)
- 《算法导论》动态规划钢条切割问题
- 从人脸识别到行人重识别,下一个风口
- 网站登录之第三方微信登录
- Monkey测试
- [配置SSD进行目标检测]
- 获取webView内容高度,自适应高度
- Android使用GridView异步加载(弱引用)网络图片(支持点击查看)
- 微软云计算,腾讯阿里验证加密