hdu 2242双联通分量+树形dp
/*先求出双联通缩点,然后进行树形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的更多相关文章
- HDU 2242 连通分量缩点+树形dp
题目大意是: 所有点在一个连通图上,希望去掉一条边得到两个连通图,且两个图上所有点的权值的差最小,如果没有割边,则输出impossible 这道题需要先利用tarjan算法将在同一连通分量中的点缩成一 ...
- 『Tarjan算法 无向图的双联通分量』
无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...
- HDU4612 Warm up —— 边双联通分量 + 重边 + 缩点 + 树上最长路
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4612 Warm up Time Limit: 10000/5000 MS (Java/Ot ...
- 【UVA10972】RevolC FaeLoN (求边双联通分量)
题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...
- lightoj 1300 边双联通分量+交叉染色求奇圈
题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...
- HDU5409---CRB and Graph 2015多校 双联通分量缩点
题意:一个联通的无向图, 对于每一条边, 若删除该边后存在两点不可达,则输出这两个点, 如果存在多个则输出第一个点尽可能大,第二个点尽可能小的. 不存在输出0 0 首先 若删除某一条边后存在多个联通分 ...
- poj2942(双联通分量,交叉染色判二分图)
题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...
- hdu 4514 并查集+树形dp
湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- 大白书中无向图的点双联通分量(BCC)模板的分析与理解
对于一个无向图,如果任意两点至少存在两条点不重复(除起点和终点外无公共点)的路径,则这个图就是点双联通. 这个要求等价于任意两条边都存在于一个简单环(即同一个点不能在圈中出现两次)中,即内部无割点. ...
随机推荐
- 【高德地图API】VS2012或者VS2013添加高德地图v2.1.1版本SDK失败
可能由于v2.1.1版本SDK可能是在Win8.1环境下编译[这里有许多的原因,系统升级,安装VS2013等等] 有童鞋在操作正常的情况下添加SDK失败,提示版本不兼容. 如下图: 编辑项目 *.c ...
- 【转】pycharm常用快捷键
转自:http://www.2cto.com/os/201410/341542.html 转来珍藏着,以后慢慢完善. 编辑类: Ctrl + Space 基本的代码完成(类.方法.属性)Ctrl + ...
- ural 1009. K-based Numbers(简单dp)
http://acm.timus.ru/problem.aspx?space=1&num=1009 题意:将一个n位数转化为合法的K进制数,有多少种情况.合法的K进制数即不含前导0,且任意两个 ...
- Instantaneous Transference(强连通分量及其缩点)
http://poj.org/problem?id=3592 题意:给出一个n*m的矩阵,左上角代表起始点,每个格子都有一定价值的金矿,其中‘#’代表岩石不可达,‘*’代表时空门可以到达指定格子,求出 ...
- 题目收藏夹(啥时候一遍A啥时候删)
以下题目为没有思路或代码离谱错误或看了题解才会的,间隔一周以上再做一遍A掉就删. bzoj1500 bzoj2287 codevs1358 bzoj1725
- [App Store Connect帮助]二、 添加、编辑和删除用户(5)创建一个沙盒测试员帐户
如果您的 App 使用了 App 内购买项目或 Apple Pay,您可以在 App Store Connect 中创建沙盒测试员帐户,以便您向用户提供该 App 前,可以使用该帐户在测试环境中运行您 ...
- Lambda表达式怎么写SQL中的in?
ambda表达式查询没有IN这个方法,可以变通一下,in查询的数组是否包含在映射对象里面的集合里 直接贴代码吧,一看就懂了 class Program { static void Main(strin ...
- 关于DOM操作的相关案例
1.模态框案例 需求: 打开网页时有一个普通的按钮,点击当前按钮显示一个背景图,中心并弹出一个弹出框,点击X的时候会关闭当前的模态框 代码如下: <!DOCTYPE html> <h ...
- [转]Android杂谈--ListView之BaseAdapter的使用
本文转自:http://blog.csdn.net/tianshuguang/article/details/7344315 话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapte ...
- ansible publishing service
# ansible 初始化服务机 - hosts: newserver vars: - basedir: opt tasks: - name: 安装常用依赖环境 yum: name={{ item } ...