/*先求出双联通缩点,然后进行树形dp*/
#include<stdio.h>
#include<string.h>
#include<math.h>
#define inf 0x3fffffff
#define N 11000
struct node
{
int u,v,next;
} bian[N*4],edge[N*4];
int head[N],yong,dfn[N],low[N],index,f[N*4],cnt,n,num[N];
int yon;
int belong[N],tot[N];
int visit[N],dp[N];
void init()
{
memset(head,-1,sizeof(head));
yong=0;
index=0;
cnt=0;
memset(dfn,0,sizeof(dfn));
memset(f,0,sizeof(f));
memset(low,0,sizeof(low));
}
int Min(int a,int b)
{
return a>b?b:a;
}
void addedge(int u,int v) //一次建图
{
bian[yong].u=u;
bian[yong].v=v;
bian[yong].next=head[u];
head[u]=yong++;
}
void tarjan(int u,int pre ) //tarjan算法求桥
{
dfn[u]=low[u]=++index;
int i;
for(i=head[u]; i!=-1; i=bian[i].next)
{
int v=bian[i].v;
if(i==(pre^1))continue;
if(!dfn[v])
{
tarjan(v,i);
low[u]=Min(low[u],low[v]);
if(low[v]>dfn[u])
{
cnt=1;//是否存在桥
f[i]=f[i^1]=1;//标记桥
}
}
else
low[u]=Min(low[u],dfn[v]);
}
return ;
}
void dfs(int u,int pre)
{
belong[u]=cnt;//缩
tot[cnt]+=num[u];//记录缩点的权值
int i,v;
for(i=head[u]; i!=-1; i=bian[i].next)
{
v=bian[i].v;
if(!f[i]&&!belong[v]&&i!=(pre^1))
dfs(v,i);
}
return ;
}
void addedge1(int u,int v) //二次建图
{
edge[yon].u=u;
edge[yon].v=v;
edge[yon].next=head[u];
head[u]=yon++;
}
void slove()
{
int i;
memset(belong,0,sizeof(belong));
memset(tot,0,sizeof(tot));
cnt=0;
for(i=1; i<=n; i++)
if(!belong[i]) //缩点
{
cnt++;
dfs(i,-1);
}
memset(head,-1,sizeof(head));
yon=0;
for(i=0; i<yong; i++) //重新建图
{
int u=bian[i].u,v=bian[i].v;
if(belong[u]!=belong[v])
{
addedge1(belong[u],belong[v]);
addedge1(belong[v],belong[u]);
// printf("%d %d\n",belong[u],belong[v]);
}
}
return ;
} int dfs1(int u) //为树形图求出他和他的子节点的权值
{
visit[u]=1;
int i,v,sum=0;
sum+=tot[u];
for(i=head[u]; i!=-1; i=edge[i].next)
{
v=edge[i].v;
if(!visit[v])
{
sum+=dfs1(v);
}
}
//printf("%d %d\n",u,sum);
dp[u]=sum;
return sum;
}
int main()
{
int m,i,j,k,a,b,c,sum,minn;
while(scanf("%d%d",&n,&m)!=EOF)
{
sum=0;
init();
for(i=1; i<=n; i++)
{
scanf("%d",&num[i]);
sum+=num[i];
}
while(m--)
{
scanf("%d%d",&a,&b);
a++;
b++;
addedge(a,b);
addedge(b,a);
}
tarjan(1,-1);
if(cnt==0) //如果不存在桥
{
printf("impossible\n");
continue;
}
slove();
memset(visit,0,sizeof(visit));
dfs1(1);
minn=inf;
for(i=1; i<=cnt; i++)
{
// printf("%d\n",dp[i]);
minn=Min(minn,fabs(sum*1.0-2.0*dp[i]));//求最优
}
printf("%d\n",minn);
}
return 0;
}

hdu 2242双联通分量+树形dp的更多相关文章

  1. HDU 2242 连通分量缩点+树形dp

    题目大意是: 所有点在一个连通图上,希望去掉一条边得到两个连通图,且两个图上所有点的权值的差最小,如果没有割边,则输出impossible 这道题需要先利用tarjan算法将在同一连通分量中的点缩成一 ...

  2. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

  3. HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...

  4. 【UVA10972】RevolC FaeLoN (求边双联通分量)

    题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...

  5. lightoj 1300 边双联通分量+交叉染色求奇圈

    题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...

  6. HDU5409---CRB and Graph 2015多校 双联通分量缩点

    题意:一个联通的无向图, 对于每一条边, 若删除该边后存在两点不可达,则输出这两个点, 如果存在多个则输出第一个点尽可能大,第二个点尽可能小的. 不存在输出0 0 首先 若删除某一条边后存在多个联通分 ...

  7. poj2942(双联通分量,交叉染色判二分图)

    题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...

  8. hdu 4514 并查集+树形dp

    湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  9. 大白书中无向图的点双联通分量(BCC)模板的分析与理解

    对于一个无向图,如果任意两点至少存在两条点不重复(除起点和终点外无公共点)的路径,则这个图就是点双联通. 这个要求等价于任意两条边都存在于一个简单环(即同一个点不能在圈中出现两次)中,即内部无割点. ...

随机推荐

  1. bzoj2841

    边双联通分量 具体详解蓝书上十分详细,因为必须是奇数个人坐在一起,那么一个人如果能选上,就必须处在一个简单奇圈中.而奇圈也是一个边双联通分量,所以我们先把边双联通分量都挖出来,然后进行二分图染色. 奇 ...

  2. 题解报告:hdu 1233 还是畅通工程

    Problem Description 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能 ...

  3. RabbitMQ~说说Exchange的几种模式

    RabbitMQ里的Exchange提供了四种模式,或者叫它类型,它们是fanout,direct,topic和header,其中前三种模式我们用的比较多,所有我们主要介绍前3种! Direct 任何 ...

  4. session一致性架构设计实践.

    一.缘起 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文. Web开发中,web-server可以自动为同一个浏览器的访问用户自动创建se ...

  5. 研磨JavaScript系列(五):奇妙的对象

    在JavaScript中,只有object和function两种东西有对象化的能力.我们先来说说函数的对象化能力. 任何一个函数都可以为其动态地添加或去除属性,这些属性可以是简单类型,可以是对象,也可 ...

  6. input获得焦点和失去焦点

    总结:placeholder因为在IE7 8 9 浏览器不支持所以没用它效果:当input获取光标的时候如果是默认提示则input内容为空.如果不是则为输入内容           当失去光标的时候, ...

  7. mysql外键创建失败原因

    引用:http://blog.csdn.net/wangpeng047/article/details/19624351 首先,如果和外键相关的几张表中已经插入了数据,可能导致外键插入的失败 在MyS ...

  8. Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?

    Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别? Java 中访问数据库的步骤 1)注册驱动: 2)建立连接: 3)创建Statement: 4)执 ...

  9. [Windows Server 2012] Discuz X3安全设置

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★[护卫神·V课堂]是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Discu ...

  10. [Windows Server 2012] Filezilla安装方法

    ★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:FileZ ...