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\)的价值.求在容 ...
随机推荐
- Windows 8 和 Windows 8.1 中对插件和 ActiveX 的支持
此文章将介绍页面在 Windows 8 适用于桌面版的 Internet Explorer 中与在新 Windows UI 的 Internet Explorer 中的不同表现. Windows 8 ...
- Android应用开发学习笔记之播放视频
作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 在Android中,我们可以通过使用VideoView类或者MediaPlayer类来播放视频. 一.使用Video ...
- 联想A800新蜂ROM V1.1 基于官方4.0.4精简省电稳定
ROM介绍 [出品]:新蜂工作室(基于官方) 1.源于官方:基于最稳定官方底包制作. 2.深度精简:自带APK数量从原厂包的131个降低到90个,精简31% 3.ROM包大小从原厂314MB精简到16 ...
- Hangfire Highlighter Tutorial
Hangfire Highlighter Tutorial Hangfire是一个开源且商业免费使用的工具函数库.可以让你非常容易地在ASP.NET应用(也可以不在ASP.NET应用)中执行多种类型的 ...
- [Android开发Tips]Bean的定义
Bean: public class Data extends BaseBean { public ArrayList<DataItem> data = new ArrayList< ...
- Andy's First Dictionary
Description Andy, 8, has a dream - he wants to produce his very own dictionary. This is not an easy ...
- 参数传递方法(Delphi1.0与win16API使用pascal方法,即从左到右)
参数传递方法李维的InsideVCL<第一章>中提到Windows定义的回调函数typedef LRESULT (CALLBACK*WNDPROC)(HWND,UNIT,WPARAM,LP ...
- android doGet和doPost
doGet和doPost的差别 get和post是http协议的两种方法,另外还有head, delete等 这两种方法有本质的差别,get仅仅有一个流,參数附加在url后.大小个数有严格限制且仅仅 ...
- [C++]函数指针与指针函数
函数指针与指针函数,之前总是分不清,今天就好好把它两认认清楚. 先从概念说起,简单是理解. 函数指针:是指针.一个指向某一个函数入口地址的指针. 指针函数:是函数.一个返回值是指针的函数. 记忆: 从 ...
- [Cocos2d-x]创建项目
从cocos2d-x 2.1.4之后,就不提供工程项目模板的安装文件了,我们只能手工修改以前的安装文件,让它连接最新的工程,但是这样很麻烦. 我们可以使用python命令创建cocos2d-x项目 步 ...