PKUACM 2018 D chocolate【并查集+克鲁斯卡尔】
传送:http://poj.openjudge.cn/practice/C18D/
依然是课件截图

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int N=405,mod=1e9+7,inf=2e9;
int T,n,d[N][N],f[N];
long long a[N];
char s[N][N];
struct qwe
{
int u,v,w;
}e[N*N];
bool cmp(const qwe &a,const qwe &b)
{
return a.w<b.w;
}
int dis(char a[],char b[])
{
int la=strlen(a+1)+1,lb=strlen(b+1)+1;
for(int i=1;i<=la;i++)
d[i][1]=i;
for(int i=1;i<=lb;i++)
d[1][i]=i;
for(int i=2;i<=la;i++)
for(int j=2;j<=lb;j++)
{
if(a[i-1]==b[j-1])
d[i][j]=d[i-1][j-1];
else
d[i][j]=min(d[i][j-1],d[i-1][j])+1;
}
return d[la][lb];
}
int zhao(int x)
{
return x==f[x]?x:f[x]=zhao(f[x]);
}
int hb(int x,int y)
{
x=zhao(x),y=zhao(y);
if(x==y)
return x;
f[x]=y;
return y;
}
bool ok(int x,int cnt)
{
int mn=inf,mx=-inf;
for(int i=1;i<=cnt;i++)
{
int fu=zhao(e[i].u),fv=zhao(e[i].v);
if(fu==x&fv==x)
mx=max(mx,e[i].w);
else if((fu==x&&fv!=x)||(fu!=x&&fv==x))
mn=min(mn,e[i].w);
}
return mx<mn;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
f[i]=i,a[i]=1;
for(int i=1;i<=n;i++)
scanf("%s",s[i]+1);
int cnt=0;
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
e[++cnt]=(qwe){i,j,dis(s[i],s[j])};
sort(e+1,e+1+cnt,cmp);
long long ans=0;
int tot=n;
for(int i=1;i<=cnt;i++)
{
int fu=zhao(e[i].u),fv=zhao(e[i].v);
if(fu==fv)
continue;
int nw=hb(e[i].u,e[i].v);
a[nw]=a[fu]*a[fv]%mod;
if(ok(nw,cnt))
a[nw]=(a[nw]+1)%mod;
tot--;
if(tot==1)
ans=a[nw];
}
printf("%lld\n",ans);
}
return 0;
}
PKUACM 2018 D chocolate【并查集+克鲁斯卡尔】的更多相关文章
- hdu5441 并查集+克鲁斯卡尔算法
这题计算 一张图上 能走的 点对有多少个 对于每个限制边权 , 对每条边排序,对每个查询排序 然后边做克鲁斯卡尔算法 的时候变计算就好了 #include <iostream> #inc ...
- 图的生成树(森林)(克鲁斯卡尔Kruskal算法和普里姆Prim算法)、以及并查集的使用
图的连通性问题:无向图的连通分量和生成树,所有顶点均由边连接在一起,但不存在回路的图. 设图 G=(V, E) 是个连通图,当从图任一顶点出发遍历图G 时,将边集 E(G) 分成两个集合 T(G) 和 ...
- hdu 1233(还是畅通project)(prime算法,克鲁斯卡尔算法)(并查集,最小生成树)
还是畅通project Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- 2018 计蒜之道复赛 贝壳找房魔法师顾问(并查集+dfs判环)
贝壳找房在遥远的传奇境外,找到了一个强大的魔法师顾问.他有 22 串数量相同的法力水晶,每个法力水晶可能有不同的颜色.为了方便起见,可以将每串法力水晶视为一个长度不大于 10^5105,字符集不大于 ...
- 2018.11.04 NOIP训练 小水塘(并查集)
传送门 这是复习普及组的时候做过的题了. 之前一直觉得很难码没有去做. 现在发现可以用并查集直接水过去. 其实就是把题目中说的连通的部分的面积用带权并查集维护一下就行了. 代码: #include&l ...
- 2018.11.02 NOIP模拟 飞越行星带(最小生成树/二分+并查集)
传送门 发现题目要求的就是从下到上的瓶颈路. 画个图出来发现跟去年noipnoipnoip提高组的奶酪差不多. 于是可以二分宽度+并查集检验,或者直接求瓶颈. 代码
- 2018.10.01 bzoj3237: [Ahoi2013]连通图(cdq分治+并查集)
传送门 cdq分治好题. 对于一条边,如果加上它刚好连通的话,那么删掉它会有两个大集合A,B.于是我们先将B中禁用的边连上,把A中禁用的边禁用,再递归处理A:然后把A中禁用的边连上,把B中禁用的边禁用 ...
- 2018.09.30 bzoj4025: 二分图(线段树分治+并查集)
传送门 线段树分治好题. 这道题实际上有很多不同的做法: cdq分治. lct. - 而我学习了dzyo的线段树分治+并查集写法. 所谓线段树分治就是先把操作分成lognlognlogn个连续不相交的 ...
- 2018.09.26 bzoj1015: [JSOI2008]星球大战starwar(并查集)
传送门 并查集经典题目. 传统题都是把删边变成倒着加边,这道题是需要倒着加点. 处理方法是将每个点与其他点的边用一个vector存起来,加点时用并查集统计答案就行了. 代码: #include< ...
随机推荐
- C51 独立按键 个人笔记
独立按键类似于一个开关,按下时开关闭合 防抖 硬件防抖 软件防抖 通过延时,滤掉抖动的部分 电路图 普中科技的开发板,独立按键电路图如下 判断按键按下 因此判断是否按下开关的方法是看引脚是否为低电平( ...
- ORACLE审计小结
ORACLE审计小结 1.什么是审计 审计(Audit)用于监视用户所执行的数据库操作,并且Oracle会将审计跟踪结果存放到OS文件(默认位置为$ORACLE_BASE/admin/$ORACLE_ ...
- ZOJ2193 AOV建模
每个窗口有四个小区域组成,那么不断往前递推,到达打开当前窗口时必然是那些在上面出现的窗口都已经被打开过了,那么我们可以认为是在第i个窗口的位置上出现了 j , 那么in[i]++ , 只有 i 入度为 ...
- linux 磁盘阵列
1.独立磁盘冗余阵列 (RAID) 2.RAID级别: raid0 扩展卷 (条带卷) 至少一块硬盘 具有较高的存储性能 数据请求多块硬盘并行应答 连续数据分散到多个磁盘存储 ,一块磁盘坏掉所有文件就 ...
- codevs——1009 产生数
1009 产生数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 给出一个 ...
- Redis持久化方式--RDB和AOF
转载于:https://www.cnblogs.com/xingzc/p/5988080.html Redis提供了RDB持久化和AOF持久化 RDB机制的优势和略施 RDB持久化是指在指定的时间间隔 ...
- 洛谷 P1883 函数
P1883 函数 题目描述 给定n个二次函数f1(x),f2(x),...,fn(x)(均形如ax^2+bx+c),设F(x)=max{f1(x),f2(x),...,fn(x)},求F(x)在区间[ ...
- Oracle将一列值逗号拼接wm_concat函数
--Oracle12c不再支持该函数,需要手动处理 --管理员登录授权给用户权限 GRANT CREATE SYNONYM TO c##sdic; / --创建 TYPE CREATE OR REPL ...
- Android GIS开发系列-- 入门季(9) 定位当前的位置
利用MapView定位当前的位置 这里要用到Arcgis中的LocationDisplayManager这个类,由于比较简单.直接上代码: LocationDisplayManager locatio ...
- 怎么让Excel显示时间时候能把秒显示出来
Excel显示时间一般只显示年月日小时分钟怎么能够把秒也显示出来既如下显示 2007-04-11 12:00:00 将单元格格式设为"自定义",在"类型"框中输 ...