Description

Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种。但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一个公共朋友,即对同一岛上的任意两个生物\(a\)和\(b\)有且仅有一个生物\(c\)既是\(a\)的朋友也是\(b\)的朋友,当然某些岛上也可能会只有一个生物孤单地生活着。这一习性有一个明显的好处,当两个生物发生矛盾的时候,他们可以请那个唯一的公共朋友来裁决谁对谁错。

另外,岛与岛之间也有交流,具体来说,每个岛都会挑选出一个最聪明的生物做代表,然后这个生物与他相邻的两个岛的代表成为朋友。

不行的是,A世界准备入侵Neverland,作为Neverland的守护者,Lostmonkey想知道在一种比较坏的情况下Never的战斗力。因为和朋友并肩作战,能力会得到提升,所以Lostmonkey想知道在不选出一对朋友的情况下Neverland的最大战斗力。即选出一些生物,且没有一对生物是朋友,并且要求它们的战斗力之和最大。

Input

第一行包含用空格隔开的两个整数\(n\)和\(m\),分别表示Neverland的生物种数和朋友对数。接下来的\(m\)行描述所有朋友对,具体来说,每行包含用空格隔开的两个整数\(a\)和\(b\),表示生物\(a\)和生物\(b\)是朋友(每对朋友只出现一次)。第\(m+2\)行包含用空格隔开的\(n\)个整数,其中第\(i\)个整数表示生物i的战斗力\(A_{i}\)。

Output

仅包含一个整数,表示满足条件的最大战斗力。

Sample Input

6 7

1 2

2 3

3 4

4 1

3 6

3 5

5 6

20 10 30 15 20 10

Sample Output

50

Hint

输入数据保证\(4 \le n \le 100000\),\(1 \le a,b \le n\),\(1 \le m \le 200000\),\(-1000 \le Ai \le 1000\)。

BZOJ 1040

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std; #define inf (1<<30)
#define maxn 200010
int n,m,cnt,cir[maxn],w[maxn],fa[maxn],side[maxn];
int dfn[maxn],low[maxn],toit[maxn*2],next[maxn*2];
int f[maxn][2],g[maxn][2],ans; inline int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
} inline void add(int a,int b) { next[++cnt] = side[a]; toit[cnt] = b; side[a] = cnt; } inline void ins(int a,int b) { add(a,b); add(b,a); } inline void dp(int root,int last)
{
int nn = 0;
while (last != root) cir[++nn] = last,last = fa[last];
cir[++nn] = root;
for (int i = 1;i <= nn;++i) g[cir[i]][0] = f[cir[i]][0],g[cir[i]][1] = f[cir[i]][1];
g[root][1] = inf;
for (int i = nn-1;i;--i)
{
g[cir[i]][0] += min(g[cir[i+1]][0],g[cir[i+1]][1]);
g[cir[i]][1] += g[cir[i+1]][0];
}
f[root][0] = min(g[cir[1]][0],g[cir[1]][1]);
for (int i = 1;i <= nn;++i) g[cir[i]][0] = f[cir[i]][0],g[cir[i]][1] = f[cir[i]][1];
g[root][0] = inf;
for (int i = nn-1;i;--i)
{
g[cir[i]][0] += min(g[cir[i+1]][0],g[cir[i+1]][1]);
g[cir[i]][1] += g[cir[i+1]][0];
}
f[root][1] = g[cir[1]][0];
} inline void dfs(int now)
{
dfn[now] = low[now] = ++cnt;
f[now][0] = w[now];
for (int i = side[now];i;i = next[i])
if (toit[i] != fa[now])
{
if (fa[toit[i]] == now) continue;
if (!dfn[toit[i]]) fa[toit[i]] = now,dfs(toit[i]);
low[now] = min(low[now],low[toit[i]]);
if (low[toit[i]] > dfn[now])
{
f[now][0] += min(f[toit[i]][0],f[toit[i]][1]);
f[now][1] += f[toit[i]][0];
}
}
for (int i = side[now];i;i = next[i])
if (toit[i] != fa[now] && dfn[toit[i]] > dfn[now] && fa[toit[i]] != now)
dp(now,toit[i]);
} int main()
{
freopen("1487.in","r",stdin);
freopen("1487.out","w",stdout);
n = read(); m = read();
for (int i = 1;i <= m;++i) ins(read(),read());
for (int i = 1;i <= n;++i) w[i] =read(),ans += w[i];
for (int i = 1;i <= n;++i)
if (!dfn[i]) cnt = 0,dfs(i),ans -= min(f[i][0],f[i][1]);
printf("%d",ans);
fclose(stdin); fclose(stdout);
return 0;
}

BZOJ 1487 无归岛的更多相关文章

  1. 【刷题】BZOJ 1487 [HNOI2009]无归岛

    Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一 ...

  2. 【BZOJ1487】[HNOI2009]无归岛(动态规划)

    [BZOJ1487][HNOI2009]无归岛(动态规划) 题面 BZOJ 洛谷 题解 哪来的这么多废话啊,直接说一个仙人掌得了. 然后就是要你求仙人掌最大独立集了.(随便蒯份原来的代码就过了) 不过 ...

  3. bzoj1487 [HNOI2009]无归岛

    Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛 上的任意两个生物,他们有且仅有 ...

  4. P4410 [HNOI2009]无归岛

    P4410 [HNOI2009]无归岛 显然这还是一个仙人掌图 对于同一个岛上的任意两个生物,他们有且仅有一个公共朋友 要求求最大独立集,和树形dp一样,遇到环时单独提出来处理一下就好了 #inclu ...

  5. 【BZOJ1487】[HNOI2009]无归岛(仙人掌 DP)

    题目: BZOJ1487 分析: 题目中给定的图一定是一棵仙人掌(每条边最多属于一个环),证明如下: 先考虑单独一个岛的情况.第一,一个岛一定是一张「弦图」,即任意一个大小超过 3 的环都至少有 1 ...

  6. [HNOI2009]无归岛

    Description Neverland是个神奇的地方,它由一些岛屿环形排列组成,每个岛上都生活着之中与众不同的物种.但是这些物种都有一个共同的生活习性:对于同一个岛上的任意两个生物,他们有且仅有一 ...

  7. 2019.02.07 bzoj1487: [HNOI2009]无归岛(仙人掌+树形dp)

    传送门 人脑转化条件过后的题意简述:给你一个仙人掌求最大带权独立集. 思路:跟这题没啥变化好吗?再写一遍加深记忆吧. 就是把每个环提出来分别枚举环在图中的最高点选还是不选分别dpdpdp一下即可,时间 ...

  8. 【题解】HNOI2009无归岛

    这题真的是无语了,在哪个岛上根本就没有任何的用处……不过我是画了下图,感受到一定是仙人掌,并不会证.有谁会证的求解…… 如果当做仙人掌来做确实十分的简单.只要像没有上司的舞会一样树形dp就好了,遇到环 ...

  9. Luogu-4410 [HNOI2009]无归岛

    裸的仙人掌最大独立子集,结果一个zz的错误让我调了好久... \(-inf\)开始设为\(0x7fffffff\)结果\(A_i\)有负数一加就炸了 #include<cstdio> #i ...

随机推荐

  1. TFS(Team Foundation Server)介绍和入门

    在本文的两个部分中,我将介绍Team Foundation Server的一些核心特征,重点介绍在本产品的日常应用中是怎样将这些特性结合在一起使用的. 作为一名软件开发者,在我的职业生涯中,我常常会用 ...

  2. delphi TOpenDialog

        TOpenDialog     procedure TForm1.Button1Click(Sender: TObject);begin  with TOpenDialog.Create(ni ...

  3. cubieboard变身AP 分类: ubuntu cubieboard 2014-11-25 14:04 277人阅读 评论(0) 收藏

    加载bcmdhd模块:# modprobe bcmdhd 如果你希望开启 AP 模式,那么:# modprobe bcmdhd op_mode=2 在/etc/modules文件内添加bcmdhd o ...

  4. dump_stack的简单使用 +CALL TREE

    http://blog.chinaunix.net/uid-26403844-id-3361770.html http://blog.csdn.net/zifeng274059226/article/ ...

  5. Qt 学习之路 :信号槽

    信号槽是 Qt 框架引以为豪的机制之一.熟练使用和理解信号槽,能够设计出解耦的非常漂亮的程序,有利于增强我们的技术设计能力. 所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被 ...

  6. object C—类中函数的调用

    Object C-类中函数的调用 创建,三个类.然后,在代码中调用相同名字的函数.观察他们的调用次序. @interface test : NSObject - (void)print; @end @ ...

  7. 一次优化web项目的经历记录(一)

    一次优化web项目的经历记录 这段时间以来的总结与反思 前言:最近很长一段时间没有更新博客了,忙于一堆子项目的开发,严重拖慢了学习与思考的进程.开水倒满了需要提早放下杯子,晚了就会烫手,这段时间以来, ...

  8. Java中ArrayList问题:删除一个ArrayList中的重复元素,注意留意一个问题

    该问题有两种方法: 一 利用两个数组,此法简单,不讨论 二 利用一个数组,从第0个开始依次取元素,并在其后元素中查找是否有该元素,有则删掉后面的重复元素,依次遍历.---但是这种情况要特别注意,当后续 ...

  9. linux设置语言编码

    前段时间在服务器上安装了centos6.2版本,当初安装时语言选择英文.这本来也没有什么问题,直到前一段时间.我的同事发现部署的web项目中出现乱码情况.但中文作为参数进行传递到下一个页面的时候就乱码 ...

  10. 委托、 Lambda表达式和事件——事件

    /* * 由SharpDevelop创建. * 用户: David Huang * 日期: 2015/7/31 * 时间: 14:21 */ using System; namespace 事件 { ...