考试的时候看少了一行,导致暴力都写错额…

贾教说他出的这题水,但是我觉得并不水,那个结论还是很神的。

首先M(i)就是i的最小生成树的最大边,

设f[i]表示i属于哪个集合

我们把边按权值从小到大排序,对于一条边(u,v),权值为w,

如果w<=min(M(f[u])+Z[C[f[u]]],M(f[v])+Z[C[f[v]]]),

那么u,v就不能分开,否则不满足“半完美”这个条件,那就把它们放入一个集合。

搞完之后扫一遍输出每个集合即可。

至于怎么证明正确性,我也不知道。

#include<cstdio>
#include<algorithm>
#define N 100010
using namespace std;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
struct pp{int u,v,w;}a[500010];
inline bool cmp(pp a,pp b){return a.w<b.w;}
int n,m,i,j,z[N],M[N],c[N],f[N],ed,g[N],nxt[N<<1],v[N<<1],k,cnt[N];
inline void add(int x,int y){v[++ed]=y;nxt[ed]=g[x];g[x]=ed;}
void go(int x,int pre,int y){
f[x]=y;
for(int i=g[x];i;i=nxt[i])if(v[i]!=pre)go(v[i],x,y);
}
inline void link(int x,int y,int z){
if(f[x]==f[y])return;
if(c[f[x]]>c[f[y]])swap(x,y);
c[f[y]]+=c[f[x]];M[f[y]]=z;
go(x,0,f[y]);
add(x,y);add(y,x);
}
int main(){
read(n);read(m);
for(i=1;i<=n;i++)read(z[i]);
for(i=1;i<=m;i++)read(a[i].u),read(a[i].v),read(a[i].w);
sort(a+1,a+m+1,cmp);
for(i=1;i<=n;i++)f[i]=i,c[i]=1;
for(i=1;i<=m;i++)if(a[i].w<=min(M[f[a[i].u]]+z[c[f[a[i].u]]],M[f[a[i].v]]+z[c[f[a[i].v]]]))link(a[i].u,a[i].v,a[i].w);
for(i=1;i<=n;i++)g[i]=0;
ed=0;
for(i=1;i<=n;i++){
if(!cnt[f[i]])k++;
cnt[f[i]]++;
add(f[i],i);
}
for(printf("%d\n",k),i=1;i<=n;i++)if(cnt[i]){
for(printf("%d",cnt[i]),j=g[i];j;j=nxt[j])printf(" %d",v[j]);
puts("");
}
return 0;
}

  

BZOJ3559 : [Ctsc2014]图的分割的更多相关文章

  1. [Ctsc2014]图的分割

    [Ctsc2014]图的分割 阅读理解好题 翻译一下: M(C)就是C这个诱导子图最小生成树最大边权 结论: 按照w进行sort,如果满足w<=Ci,Cj表示u,v的连通块的诱导子图 并且Ci! ...

  2. bzoj 3559: [Ctsc2014]图的分割【最小生成树+并查集】

    读题两小时系列-- 在读懂题意之后,发现M(c)就是c这块最大权割边也就是的最小生成树的最大权边的权值,所以整个问题都可以在MST的过程中解决(M和c都是跟着并查集变的) 不过不是真的最小生成树,是合 ...

  3. hdu 3435 图回路分割

    将一个无向图分成许多回路,回路点交集为空,点幷集为V.幷最小化回路边权和. #include <cstdio> #include <cstring> #include < ...

  4. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  5. 基于谱聚类的三维网格分割算法(Spectral Clustering)

    谱聚类(Spectral Clustering)是一种广泛使用的数据聚类算法,[Liu et al. 2004]基于谱聚类算法首次提出了一种三维网格分割方法.该方法首先构建一个相似矩阵用于记录网格上相 ...

  6. I-图的分割(二分+并查集)

    图的分割 题目大意: 给你n个点,m条边的图,没有重环和自环,所有的点都联通 可以通过删除几条边使得整个图变成两个联通子图 求删除的边中最大边权的最小值 解题思路: 看到"最大边权的最小值& ...

  7. 【CSS进阶】试试酷炫的 3D 视角

    写这篇文章的缘由是因为看到了这个页面: 戳我看看(移动端页面,使用模拟器观看) 运用 CSS3 完成的 3D 视角,虽然有一些晕3D,但是使人置身于其中的交互体验感觉非常棒,运用在移动端制作一些 H5 ...

  8. CSS3与页面布局学习总结(六)——CSS3新特性(阴影、动画、渐变、变形、伪元素等)

    CSS3在CSS2.1的基础上新增加了许多属性,这里选择了较常用的一些功能与大家分享,帮助文档中有很详细的描述,可以在本文的示例中获得帮助文档. 一.阴影 1.1.文字阴影 text-shadow&l ...

  9. iOS10 推送必看(基础篇)

    虽然这篇文章比较长,也不好理解,但是还是建议大家收藏,以后用到的时候,可以看看,有耐心的还是读一读. 这篇文章开始,我会跟大家好好讲讲,苹果新发布的iOS10的所有通知类. 一.创建本地通知事例详解: ...

随机推荐

  1. 001课-java_web开发入门

    一.Tomcat服务器常见启动问题:(1).Java_home环境变量,由于tomcat服务器的bin目录中的一些jar文件必须使用到java类库,所以必须先配置Java_home环境变量.(2).端 ...

  2. self和parent的用法

    总结 self  , parent 的用法               只能用在类的内部 self  本类  (不要理解成本对象) parent 父类 在引入自身的静态属性/静态方法 以及父类的方法时 ...

  3. MVC缓存03,扩展方法实现视图缓存

    关于缓存,先前尝试了: ● 在"MVC缓存01,使用控制器缓存或数据层缓存"中,分别在控制器和Data Access Layer实现了缓存 ● 在"MVC缓存02,使用数 ...

  4. svn不知道这样的主机

    重做服务器后,计算机名称肯定是不一样的.我们之前的项目还是老计算机名字,只要更改一下计算机名字即可实现.或者更改

  5. EChart使用简单介绍

    Echart是百度研发团队开发的一款报表视图JS插件,功能十分强大,使用内容做简单记录:(EChart下载地址 http://echarts.baidu.com/download.html) 1.ti ...

  6. ora-01658 :无法为表空间USERS 中的段创建INITIAL区

    "CREATE INDEX "IDX_TS_BONUS_Q_201209_DS" ON "TS_BONUS_Q_201209" ("DS&q ...

  7. ytu 1058: 三角形面积(带参的宏 练习)

    1058: 三角形面积 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 190  Solved: 128[Submit][Status][Web Boar ...

  8. Oracle【IT实验室】数据库备份与恢复之四:RMAN(备份与恢复管理器)

    RMAN是ORACLE提供的一个备份与恢复的工具,可以用来备份和还原数据库文件. 归档日志和控制文件.它也可以用来执行完全或不完全的数据库恢复. RMAN可以由命令行接口或者 OEM的 Backup ...

  9. 信号通讯编程,王明学learn

    信号通讯编程 在Linux系统中,信号(signal)同样也是最为古老的进程间通信机制. 一.信号类型 Linux系统支持的所有信号均定义在/usr/include/asm/signal.h(展示), ...

  10. VS2012 配置 OpenCV3.0

    VS2012 配置 opencv3.0,相比之前的版本,3.0的配置简单了好多. 通过配置属性文件,可以做到一次配置,重复使用! 根据文章的操作在 win7 64bit VS2012 下成功配置 op ...