HDU5438--Ponds (拓排+BFS)
题意:给定n个池塘,m对池塘相连,现在要将与少于2个池塘相连的池塘拆除,形成森林,求节点数为奇数的树权值之和
思路:按照拓排的思想不断删除度数小于2的节点
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e4+5;
vector <ll> G[N];
queue <ll> Q;//拓排队列
queue <ll> P;//BFS队列
bool visit[N];//符合条件的点
ll value[N];
ll vis[N];//bfs遍历过的点
ll degree[N];//度数
ll m,n,ans;
void topsort()
{
while(!Q.empty()) Q.pop();
for(int i=1;i<=n;i++)
{
if(degree[i]<2)
{
if(degree[i]==1) Q.push(i);
visit[i]=1;
}
}
while(!Q.empty())
{
ll temp=Q.front();
Q.pop();
int len=G[temp].size();
for(int i=0;i<len;i++)
{
if(--degree[G[temp][i]]<2)
{
if(degree[G[temp][i]]==1) Q.push(G[temp][i]);
visit[G[temp][i]]=1;
}
}
}
}
ll bfs(int x)
{
ll sum=value[x],num=1;
P.push(x);
vis[x]=1;
while(!P.empty())
{
ll temp=P.front();
P.pop();
int len=G[temp].size();
for(int i=0;i<len;i++)
{
if(!vis[G[temp][i]]&&!visit[G[temp][i]])
{
P.push(G[temp][i]);
vis[G[temp][i]]=1;
num++;
sum+=value[G[temp][i]];
}
}
}
if(num&1) return sum;
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
memset(visit,0,sizeof(visit));
memset(degree,0,sizeof(degree));
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&value[i]);
for(int i=1;i<=n;i++)
G[i].clear();
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
degree[x]++;
degree[y]++;
G[x].push_back(y);
G[y].push_back(x);
}
topsort();
ans=0;
for(int i=1;i<=n;i++)
{
if(!vis[i]&&!visit[i])
ans+=bfs(i);
}
printf("%lld\n",ans);
}
return 0;
}
HDU5438--Ponds (拓排+BFS)的更多相关文章
- codeforces 721C (拓排 + DP)
题目链接:http://codeforces.com/contest/721/problem/C 题意:从1走到n,问在时间T内最多经过多少个点,按路径顺序输出. 思路:比赛的时候只想到拓排然后就不知 ...
- HDU-2647 Reward ,逆拓排。
Reward 发工资,以前看过这题,做没做忘了(应该是没做). 很明显的拓排.但数据范围这么大,吓得我当时就不敢动手.后来找题解发现还是相当于两层循环(are you kidding me?)当时卡在 ...
- The Party and Sweets CodeForces - 1159C (拓排)
优化连边然后拓排. #include <iostream> #include <sstream> #include <algorithm> #include < ...
- hdu5438 Ponds[DFS,STL vector二维数组]
目录 题目地址 题干 代码和解释 参考 题目地址 hdu5438 题干 代码和解释 解答本题时参考了一篇代码较短的博客,比较有意思,使用了STL vector二维数组. 可以结合下面的示例代码理解: ...
- hdu5438 Ponds dfs 2015changchun网络赛
Ponds Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Sub ...
- HDU5438:Ponds(拓扑排序)
Ponds Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Sub ...
- hdu5438 Ponds
Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Total Submissi ...
- [poj2762] Going from u to v or from v to u?(Kosaraju缩点+拓排)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud Going from u to v or from v to u? Tim ...
- uva12489 Combating cancer(树同构)
转载请注明出处: http://www.cnblogs.com/fraud/ ——by fraud https://uva.onlinejudge.org/index.php?opt ...
随机推荐
- c/c++----网站及其后门(CGI应用程序)
C/C++学习到这儿,结合自己曾经学过的javasweb知识,现在让我们来看看,如何做一个CGI程序吧! 首先了解一下啥子叫CGI :CGI全称是“公共网关接口”(Common Gateway In ...
- IE10 CSS hack,IE兼容问题
IE10 CSS hack,IE兼容问题 作者: 雪影 发表于2013 年 4 月 25 日 分类:技术分享 | 暂无评论 | 人气: 376 度 首先,ie10不支持条件注释了. 方法一:特性检测: ...
- java版复利计算
这是我修改为java的初定界面,还有很多细节问题还没有解决,希望老师可以给我多点的点评,接下来继续努力,我会把每一次的进步发上来,不断的去锻炼. 1.我所用的开发工具是ecipse 2.所有的语言为j ...
- UVa 11021 - Tribles
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- bzoj 1036 Tree Count
题目大意:给出一棵树,每个点有一个权值,要求三种操作:1.修改某个点的权值,2.询问x到y路径上各点的权值最大值,3.询问x到y路径上各点的权值之和. #include <cstdio> ...
- DB2使用笔记
1.赋予用户LOAD权限的步骤 使用实例用户db2inst1登录数据库: 使用命令db2 update dbm cfg using sysadm_group dasadm1给管理员用户组d ...
- jsp中普通按钮如何提交表单
jsp中普通按钮如何提交表单方法1: <form action = "提交的地址"> <input type="submit" ...
- RPI学习--wiringpi_API
reference: https://projects.drogon.net/raspberry-pi/wiringpi/functions/ Functions (API) Some of the ...
- SpringMvc中的反射
controller中的方法,是通过反射调用的 spring监控controller中的注解,当命令符合某个注解的时候,通过反射,找到这个注解对应的方法,然后调用,处理完成得到返回值,再根据这个返回值 ...
- 从github上面拷贝源码
http://www.cnblogs.com/xing901022/p/4287064.html