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+缩点)的更多相关文章

  1. 软件安装:树上分组DP/tarjan缩点/(也许基环树?)

    提炼:tarjan环缩成点,建0虚根,跑树形DP,最难的是看出可能有n个点n条边然后缩点,n个点n条边可能不只有一个环 n个点n条边->基环树: 基环树,也是环套树,简单地讲就是树上在加一条边. ...

  2. 洛谷P2515 [HAOI2010]软件安装(tarjan缩点+树形dp)

    传送门 我们可以把每一个$d$看做它的父亲,这样这个东西就构成了一个树形结构 问题是他有可能形成环,所以我们还需要一遍tarjan缩点 缩完点后从0向所有入度为零的点连边 然后再跑一下树形dp就行了 ...

  3. BZOJ 2427 /HAOI 2010 软件安装 tarjan缩点+树形DP

    终于是道中文题了.... 当时考试的时候就考的这道题.... 果断GG. 思路: 因为有可能存在依赖环,所以呢 先要tarjan一遍 来缩点. 随后就进行一遍树形DP就好了.. x表示当前的节点.j表 ...

  4. HDU4612(Warm up)2013多校2-图的边双连通问题(Tarjan算法+树形DP)

    /** 题目大意: 给你一个无向连通图,问加上一条边后得到的图的最少的割边数; 算法思想: 图的边双连通Tarjan算法+树形DP; 即通过Tarjan算法对边双连通缩图,构成一棵树,然后用树形DP求 ...

  5. 洛谷 P2515 [HAOI2010]软件安装(缩点+树形dp)

    题面 luogu 题解 缩点+树形dp 依赖关系可以看作有向边 因为有环,先缩点 缩点后,有可能图不联通. 我们可以新建一个结点连接每个联通块. 然后就是树形dp了 Code #include< ...

  6. [HAOI2010]软件安装(树形背包,tarjan缩点)

    题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). 但是 ...

  7. 硬币问题 tarjan缩点+DP 莫涛

    2013-09-15 20:04 题目描述 有这样一个游戏,桌面上摆了N枚硬币,分别标号1-N,每枚硬币有一个分数C[i]与一个后继硬币T[i].作为游戏参与者的你,可以购买一个名为mlj的小机器人, ...

  8. Tarjan+树形DP【洛谷P2515】[HAOI2010]软件安装

    [洛谷P2515][HAOI2010]软件安装 题目描述 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得 ...

  9. 【BZOJ2427】[HAOI2010] 软件安装(缩点+树形DP)

    点此看题面 大致题意: 有\(N\)个软件,每个软件有至多一个依赖以及一个所占空间大小\(W_i\),只有当一个软件的直接依赖和所有的间接依赖都安装了,它才能正常工作并造成\(V_i\)的价值.求在容 ...

随机推荐

  1. <摘录>详谈高性能TCP服务器的开发

    对于开发一款高性能服务器程序,广大服务器开发人员在一直为之奋斗和努力.其中一个影响服务器的重要瓶颈就是服务器的网络处理模块.如果一款服务器程序不能及时的处理用户的数据.则服务器的上层业务逻辑再高效也是 ...

  2. form表单和表格

    HTML <table> 标签 border pixels 规定表格边框的宽度. STF cellpadding pixels % 规定单元边沿与其内容之间的空白. STF cellspa ...

  3. Cocos2d-x layout (二)

    相对某个控件进行布局 Size widgetSize = Director::getInstance()->getWinSize(); Text* alert = Text::create(&q ...

  4. [IDEs]Eclipse For Mac , 常用快捷键

    Cmd + O:  查看.java中得方法,变量,等结构 Cmd + T:     查看继承关系 Cmd + K:          查找下一个选中的成员 Cmd + E:  查看已经打开的文件 Cm ...

  5. sqlserver 自学笔记之 常量,变量及函数

    (1)全局变量. 输入以下sql语句,根据查询结果,了解sqlserver全局变量的含义 select @@VERSIONselect @@CONNECTIONSselect @@CURSOR_ROW ...

  6. java web从零单排第十六期《struts2》控制标签(2)

    1.s:subset标签概述: s:subset标签功能是从一个集合中取出部分元素合并成一个新的集合,新生成的这个集合是原来集合的子集.属性和意义如下: 属性名 是否必需 默认值 类型 说明介绍 co ...

  7. c语言实现动态指针数组Dynamic arrays

    c语言实现动态数组.其它c的数据结构实现,hashTable參考点击打开链接 treeStruct參考点击打开链接 基本原理:事先准备好一个固定长度的数组. 假设长度不够的时候.realloc一块区域 ...

  8. 【MFC两种视频图像採集方法】DirectShow与Opencv

    效果图: DirectShow採集核心代码: 创建线程调用该函数,採集图像通过x264解码封装rtmp协议包.推送至FMSserver,可实现视频直播 UINT __stdcall StartVide ...

  9. [Xcode]SVN的使用

    当发生冲突时: (p)postpone: -mark the conflict be resolved later 保持冲突,手动修改源文件解决冲突 (df)diff-full: -show all ...

  10. EF中的事务处理的初步理解

    http://yanwushu.byethost7.com/?p=87 1. EF对事务进行了封装:context的saveChange()是有事务性的. 2. 依赖多个不同的Context的操作(即 ...