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. [页面模板框架对比] Apache Tiles VS Sitemesh

    1. 原理对比 (1) Apache Tiles 顾名思义,Tile是瓷砖的意思,也就是说一个网页是由多个Tile组成的. 用户通过访问一个页面的Apache Tiles定义名,就可以访问一个由定义文 ...

  2. 【Node.js 自己封装的库 http_parse, libuv】

    [Node.js 自己封装的库 http_parse, libuv] Node.js 介绍:一个网络框架,更多:http://www.oschina.net/p/nodejs 官网:http://no ...

  3. ThinkPhp学习12

    原文:ThinkPhp学习12 二.输出模板内容      (重点) a.display 1.display中没有参数    $this->display(); 2.可以带参数    $this ...

  4. setenv 和 set

    setenv 和 set 是在csh系列的命令,当然bash中也有set,还是有出入的.   set 是对当前进程有效,不会传递给子进程 setenv 不仅对当前进程有效,也会传递给子进程.   语法 ...

  5. php 上传文件 $_FILES['']['type']的值

    php 上传文件 $_FILES['']['type']的值 一个函数 function upload_file($fname,$ftype,$fsize,$ferror,$ftmp_name,$fp ...

  6. 远程开发调试与hot-update | (R "think-of-lisper" 'Albertlee)

    远程开发调试与hot-update | (R "think-of-lisper" 'Albertlee) 远程开发调试与hot-update

  7. VC生成的DLL给QT的EXE调用时lib路径问题小结

    VC生成的DLL给QT调用,有两种方式,一种是隐式调用调用(使用.lib文件方式): ① 在*.pro工程文件中添加VC生成的lib文件路径时,或者使用一个绝对路径,如: LIBS += " ...

  8. 怎么获取Spring的ApplicationContext

    在 WEB 开发中,可能会非常少须要显示的获得 ApplicationContext 来得到由 Spring 进行管理的某些 Bean, 今天我就遇到了,在这里和大家分享一下, WEB 开发中,怎么获 ...

  9. hdu4611 Balls Rearrangement

    Balls Rearrangement Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others) ...

  10. Linux Shell脚本编程--curl命令详解

    用途说明 curl命令是一个功能强大的网络工具,它能够通过http.ftp等方式下载文件,也能够上传文件.其实curl远不止前面所说的那些功能,大家可以通过man curl阅读手册页获取更多的信息.类 ...