hdu2242(树形dp+tarjan+缩点)
hdu2242 http://acm.hdu.edu.cn/showproblem.php?pid=2242
给定n,m表示n个点,m条边
每个点有个权值
问我们删除两某条边(割边)后将图分为两个部分,要使得两个部分的权值之差最小
这题的弱化版本是在一棵树上删除某条边后后将图分为两个部分,要使得两个部分的权值之差最小。是用树形dp来做的
但是这道题目是个图,但是我们可以转化为树,即将图中的边连通分量求出来,然后缩成一个点,建出一个新的树图,那么就可以用树形dp来求解题目了.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <iostream>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <math.h>
using namespace std;
typedef long long LL;
const int INF = <<;
const int N = + ;
vector<int> g1[N],g2[N];
int val1[N],val2[N];
int dfn[N],low[N],dfs_clock,cnt;
int belong[N];
stack<int> st;
bool vis[N];
int ans,sum;
void tarjan(int u, int fa)
{
bool flag = false;
vis[u] = true;
dfn[u] = low[u] = ++dfs_clock;
st.push(u);
for(int i=; i<g1[u].size(); ++i)
{ int v = g1[u][i];
if(v==fa && !flag)
{
flag = true;
continue;
}
if(!vis[v]) tarjan(v,u);
low[u] = min(low[u],low[v]);
}
if(dfn[u]==low[u])
{
cnt++;
int x;
do
{
x= st.top();
st.pop();
belong[x] = cnt;
val2[cnt] += val1[x];
}while(u!=x);
}
} void dfs(int u, int fa)
{
vis[u] = true;
for(int i=; i<g2[u].size(); ++i)
{
int v = g2[u][i];
if(vis[v]) continue;
dfs(v,u);
val2[u] += val2[v];
}
}
void dfs2(int u, int fa)
{
vis[u] = true;
for(int i=; i<g2[u].size(); ++i)
{
int v = g2[u][i];
if(vis[v]) continue;
ans = min(ans,abs(sum-*val2[v]));
dfs2(v,u);
}
}
int main()
{
int n,m,i,u,v,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=; i<=n; ++i)
{
g1[i].clear();
g2[i].clear();
}
sum = ;
for(i=; i<n; ++i)
{
scanf("%d",&val1[i]);
sum += val1[i];
}
for(i=; i<m; ++i)
{
scanf("%d%d",&u,&v);
g1[u].push_back(v);
g1[v].push_back(u);
}
memset(vis,,sizeof(vis));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(val2,,sizeof(val2));
dfs_clock = ;
cnt = ;
tarjan(,-);
for(i=; i<n; ++i)
for(j=; j<g1[i].size(); ++j)
{
int v = g1[i][j];
if(belong[v] != belong[i])//建新图,虽然新建的图会有重边,但是不影响树形dp
{
g2[belong[i]].push_back(belong[v]);
g2[belong[v]].push_back(belong[i]);
}
}
if(cnt==)//如果整个图是边连通的,那么不管删哪条边都不能使得图不连通
{
puts("impossible");
continue;
}
ans = INF;
memset(vis,,sizeof(vis));
dfs(,-);
memset(vis,,sizeof(vis));
dfs2(,-);
printf("%d\n",ans);
}
return ;
}
hdu2242(树形dp+tarjan+缩点)的更多相关文章
- 软件安装:树上分组DP/tarjan缩点/(也许基环树?)
提炼:tarjan环缩成点,建0虚根,跑树形DP,最难的是看出可能有n个点n条边然后缩点,n个点n条边可能不只有一个环 n个点n条边->基环树: 基环树,也是环套树,简单地讲就是树上在加一条边. ...
- 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)
传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...
- BZOJ 2427 /HAOI 2010 软件安装 tarjan缩点+树形DP
终于是道中文题了.... 当时考试的时候就考的这道题.... 果断GG. 思路: 因为有可能存在依赖环,所以呢 先要tarjan一遍 来缩点. 随后就进行一遍树形DP就好了.. x表示当前的节点.j表 ...
- HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)
/** 题目大意: 给你一个无向连通图,问加上一条边后得到的图的最少的割边数; 算法思想: 图的边双连通Tarjan算法+树形DP; 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求 ...
- 洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)
题面 luogu 题解 缩点+树形dp 依赖关系可以看作有向边 因为有环,先缩点 缩点后,有可能图不联通. 我们可以新建一个结点连接每个联通块. 然后就是树形dp了 Code #include< ...
- [HAOI2010]软件安装(树形背包,tarjan缩点)
题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...
- 硬币问题 tarjan缩点+DP 莫涛
2013-09-15 20:04 题目描述 有这样一个游戏,桌面上摆了N枚硬币,分别标号1-N,每枚硬币有一个分数C[i]与一个后继硬币T[i].作为游戏参与者的你,可以购买一个名为mlj的小机器人, ...
- Tarjan+树形DP【洛谷P2515】[HAOI2010]软件安装
[洛谷P2515][HAOI2010]软件安装 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得 ...
- 【BZOJ2427】[HAOI2010] 软件安装(缩点+树形DP)
点此看题面 大致题意: 有\(N\)个软件,每个软件有至多一个依赖以及一个所占空间大小\(W_i\),只有当一个软件的直接依赖和所有的间接依赖都安装了,它才能正常工作并造成\(V_i\)的价值.求在容 ...
随机推荐
- Jetty开发指导:HTTP Client
介绍 Jetty HTTP client模块提供易用的API.工具类和一个高性能.异步的实现来运行HTTP和HTTPS请求. Jetty HTTP client模块要求Java版本号1.7或者更高,J ...
- html中的rowspan和colspan
摘自w3school(http://www.w3school.com.cn/tags/att_td_colspan.asp)colspan 属性规定单元格可横跨的列数.<table border ...
- java中Hashtable中的t为什么是小写(转)
因为在很多年前刚学java的时候用到Hashtable的时候比较好奇为什么第二个t是小写,这不符合sun的风格啊,整个jdk都是标准驼峰,于是带着这个疑问翻过 很多书,看多很多资料,最后的结论是: H ...
- 关于使用commons-email包测试发送邮件遇到的问题
项目中有个需求是这样的:客户办理某一项业务,当用户成功提交业务办理信息后,系统生成一个业务随机码给用户,以此作为以后的业务办理结果查询依据.鉴于随机码较长,方便用户记录,在生成随机码的同时,提供用户发 ...
- linux下的开源移动图像监测程序--motion编译与配置
前几天在网上偶然看到一篇博客,是利用linxu下的开源的motion搭建嵌入式视频动态监控系统,感觉很好很强大于,是就想自己编译移植一下试试. 所谓移动图像监测,简单来说就是利用摄像头定点监测某个区域 ...
- 函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网
函数式编程很难,这正是你要学习它的原因 | 外刊IT评论网 函数式编程很难,这正是你要学习它的原因 156 次分享 新浪微博 腾讯微博 Tweet 人人网 QQ空间 很奇怪不是,很少有人每天都使用函数 ...
- hdu3790最短路径问题 (用优先队列实现的)
Problem Description 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. Inp ...
- 常用PHP中花括号使用规则详解
转自http://www.cnblogs.com/jayleke/archive/2011/11/08/2241609.html 1.简单句法规则(用花括号界定变量名,适用于PHP所有版本): $a ...
- 更改Oracle实例的字符集
(1).数据库服务器字符集select * from nls_database_parameters 来源于props$,是表示数据库的字符集. (2).服务端字符集环境select * from n ...
- linux上svn连接visual svn server时ssl鉴权失败,问题解决(转)
场景:1.在windows 7上安装了visual svn server作为自己的svn服务器. 2.在虚拟机centos 6.3上使用svn客户端check代码,报错: [plain] view p ...