<题目链接>

题目大意:

给定一个连通图,每个点有点权,现在需要删除一条边,使得整张图分成两个连通块,问你删除这条边后,两联通块点权值和差值最小是多少。

解题分析:

删除一条边,使原连通图分成两个连通分量,所以删除的那条边必然是桥。为了得到所有的桥,我们对原图进行边双连通图缩点。然后对缩点后的新图,跑一遍树形DP,得到所有桥两端点权和的最小差值。

 #include <bits/stdc++.h>
using namespace std; #define clr(a,b) memset(a,b,sizeof(a))
const int N = 1e4+, M = 2e4+;
struct Edge{
int from,to,nxt;
}edge[M<<],edge1[M<<]; int n,m,cnt,cnt1,sum,ans,dcc,tot,top;
int head[N],head1[N],instk[N],bel[N],dfn[N],low[N],val[N],val1[N],cost[N],stk[N]; void init(){
cnt=tot=sum=dcc=cnt1=;ans=1e9;
clr(dfn,);clr(low,);clr(val,);clr(head,-);clr(head1,-);
clr(instk,);clr(cost,);
}
void addedge(int u,int v){ edge[cnt].from=u;edge[cnt].to=v;edge[cnt].nxt=head[u];head[u]=cnt++; }
void addedge1(int u,int v){ edge1[cnt1].from=u;edge1[cnt1].to=v;edge1[cnt1].nxt=head1[u];head1[u]=cnt1++; } void Tarjan(int u,int fa){ //Tarjan找边双连通分量并进行缩点
dfn[u]=low[u]=++tot;
instk[u]=;stk[++top]=u;
int flag=;
for(int i=head[u];~i;i=edge[i].nxt){
int v=edge[i].to;
if(v==fa && !flag){ flag=;continue; } //跳过搜索树上的边,这种写法能够处理重边的情况
if(!dfn[v]){
Tarjan(v,u);
low[u]=min(low[u],low[v]);
}else if(instk[v])low[u]=min(low[u],dfn[v]);
}
if(dfn[u]==low[u]){
++dcc;
while(true){
int v=stk[top--];
bel[v]=dcc;
val[dcc]+=val1[v];
if(v==u)break;
}
}
}
void dfs(int u,int pre){ //树形DP得到桥两边差值的最小值
cost[u]=val[u];
for(int i=head1[u];~i;i=edge1[i].nxt){
int v=edge1[i].to;
if(v==pre)continue;
dfs(v,u);
cost[u]+=cost[v];
}
ans=min(ans,abs(sum-*cost[u]));
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF){
init();
for(int i=;i<n;i++)
scanf("%d",&val1[i]),sum+=val1[i];
for(int i=;i<=m;i++){
int u,v;scanf("%d%d",&u,&v);
addedge(u,v),addedge(v,u);
}
Tarjan(,);
if( dcc== ) { puts("impossible");continue; } //如果该图是边双连通图,说明没有桥
for(int i=;i<cnt;i++){
int u,v;u=edge[i].from;v=edge[i].to;
if(bel[u]!=bel[v])addedge1(bel[u],bel[v]); //建立单向边
}
dfs(,-);
printf("%d\n",ans);
}
}

2019-03-02

HDU 2242 考研路茫茫—空调教室 (边双连通+树形DP)的更多相关文章

  1. HDU 2242 考研路茫茫——空调教室(边双连通)

    HDU 2242 考研路茫茫--空调教室 题目链接 思路:求边双连通分量.然后进行缩点,点权为双连通分支的点权之和,缩点完变成一棵树,然后在树上dfs一遍就能得出答案 代码: #include < ...

  2. HDU 2242 考研路茫茫——空调教室 无向图缩环+树形DP

    考研路茫茫——空调教室 Problem Description 众所周知,HDU的考研教室是没有空调的,于是就苦了不少不去图书馆的考研仔们.Lele也是其中一个.而某教室旁边又摆着两个未装上的空调,更 ...

  3. HDU 2242 考研路茫茫——空调教室

    考研路茫茫——空调教室 http://acm.hdu.edu.cn/showproblem.php?pid=2242 分析: 树形dp,删边. 代码: #include<cstdio> # ...

  4. HDU 2242 考研路茫茫----空调教室

    传送门 考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  5. HDU 2242 考研路茫茫——空调教室(边双连通分量+树形dp+重边标号)

    http://acm.hdu.edu.cn/showproblem.php?pid=2242 题意: 思路:首先求一下双连通分量,如果只有一个双连通分量,那么无论断哪根管子,图还是连通的. 最后只需要 ...

  6. 【HDOJ】2242 考研路茫茫——空调教室

    tarjan缩点,然后树形dp一下可解.重点是重边的处理. /* 2242 */ #include <iostream> #include <sstream> #include ...

  7. HDU2242 考研路茫茫——空调教室 (双联通分+树形DP)

    考研路茫茫——空调教室 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. HDU 2242 双连通分量 考研路茫茫——空调教室

    思路就是求边双连通分量,然后缩点,再用树形DP搞一下. 代码和求强连通很类似,有点神奇,=_=,慢慢消化吧 #include <cstdio> #include <cstring&g ...

  9. 考研路茫茫——空调教室HDU2242(Tarjan缩点)

    题意:http://acm.hdu.edu.cn/showproblem.php?pid=2242 给你一个图,问你缩完点树上割边的做小绝对值差. 思路: 这题核算起来整整做了我一天(即24个小时)! ...

随机推荐

  1. JAVA项目中常用的异常处理情况总结

    JAVA项目中常用的异常知识点总结 1. java.lang.nullpointerexception这个异常大家肯定都经常遇到,异常的解释是"程序遇上了空指针",简单地说就是调用 ...

  2. Java的动手动脑(六)

    日期:2018.11.8 星期四 博客期:022 --------------------------------------------------------------------------- ...

  3. 用ngif 多次判断 Expression has changed after it was checked

    昨天遇到一个问题 ,用ng Expression has changed after it was checked 查了一下说在angular2中,这个错误只会在dev开发模式下出现,在pro发布版本 ...

  4. JSTL 标准标签库 (JavaServer Pages Standard Tag library, JSTL)

    JSP标准标签库(JavaServer Pages Standard Tag Library,JSTL)是一个定制标签库的集合,用来解决 像遍历Map或集合.条件测试.XML处理,甚至数据 库访问和数 ...

  5. php url函数

    1.base64_encode 与 base64_decode base64_encode(string) 表示使用 MIME base64 对数据进行编码 base64_decode(string) ...

  6. Nginx详解二十六:Nginx架构篇之性能优化

    一.性能优化考虑点 1.当前系统结构瓶颈 通过压力测试观察指标.日志检测.性能分析 2.了解业务模式 接口业务类型.系统层次化结构 3.性能与安全 二.ab接口压力测试工具 1.安装:yum -y i ...

  7. idea导入java项目

    https://blog.csdn.net/m0_37106742/article/details/70154244 ( 主要 )https://blog.csdn.net/u012099869/ar ...

  8. Error: Java VM internal error:Error Loading javai.dll

    因为前几天的JMS测试,第一次写了loadrunner的脚本,感觉路一下子宽了. 知道loadrunner可以使用java写脚本,今天就试了一下,遇到了两个第一次写Java Vuser脚本普遍都会遇到 ...

  9. JMeter 提供了六种定时器

    JMeter提供了六种定时器,下面让我们一起来学习下JMeter的定时器. 先明确一些概念: 1)定时器是在每个sampler(采样器)之前执行的,而不是之后: 是的,你没有看错,不管这个定时器的位置 ...

  10. GnuPGP介绍

    PGP(Pretty Good Privacy的首字母):PGP公司的加密.签名工具套件,使用了商业版本的IDEA算法,并集成了有商业版权的PGPdisk工具. GnuPG(GNU Privacy G ...