JSOI2008 最小生成树计数
题解:
最小生成树的两个性质:
1、边权相等的边的个数一定。
2、做完边权为w的所有边时,图的连通性相同。
证明:
1、边权相等的边的个数不一样的话就不会都同时是最小生成树了。
2、假设每种方法的做完边权为w的连通性不同,那么假设i边和j边没有同时被选,那么我们完全可以在一种方案中加入i边(或j边),使得连通性增强,而后面费用更大的边用的更少,这样与这是最小生成树矛盾。于是,命题得证。
代码:不知为何,下面程序有bug,什么时候再回来A掉……
type node1=record
x,y,w:longint;
end;
node2=record
l,r,v:longint;
end;
var e:array[..] of node1;
a:array[..] of node2;
i,n,m,ans,sum,xx,yy,cnt,tot,j:longint;
fa:array[..] of longint;
function find(x:longint):longint;
begin
if fa[x]<>x then fa[x]:=find(fa[x]);
exit(fa[x]);
end;
procedure qsort(h,l:longint);
var i,j,m:longint;
tmp:node1;
begin
i:=h;j:=l;m:=e[(i+j)>>].w;
repeat
while e[i].w<m do inc(i);
while e[j].w>m do dec(j);
if i<=j then
begin
tmp:=e[i];e[i]:=e[j];e[j]:=tmp;
inc(i);dec(j);
end;
until i>j;
if i<l then qsort(i,l);
if j>h then qsort(h,j);
end;
procedure init;
begin
readln(n,m);
for i:= to m do with e[i] do readln(x,y,w);
qsort(,m);
cnt:=;tot:=;
for i:= to n do fa[i]:=i;
for i:= to m do
begin
if e[i].w<>e[i-].w then
begin
a[cnt].r:=i-;
inc(cnt);
a[cnt].l:=i;
end;
xx:=find(e[i].x);yy:=find(e[i].y);
if xx<>yy then
begin
fa[xx]:=yy;
inc(a[cnt].v);
inc(tot);
end;
end;
a[cnt].r:=m;
if tot<n- then begin writeln();halt;end;
end;
procedure dfs(x,now,k:longint);
var xx,yy:longint;
begin
if now=a[x].r+ then
begin
if k=a[x].v then inc(sum);
exit;
end;
xx:=find(e[now].x);yy:=find(e[now].y);
if xx<>yy then
begin
fa[xx]:=yy;
dfs(x,now+,k+);
fa[xx]:=xx;fa[yy]:=yy;
end;
dfs(x,now+,k);
end;
procedure main;
begin
for i:= to n do fa[i]:=i;
ans:=;
for i:= to cnt do
begin
sum:=;
dfs(i,a[i].l,);
ans:=(ans*sum) mod ;
for j:=a[i].l to a[i].r do
begin
xx:=find(e[j].x);yy:=find(e[j].y);
if xx<>yy then fa[xx]:=yy;
end;
end;
writeln(ans);
end;
begin
init;
main;
end.
ps:A掉了……
是路径压缩的问题,此题数据规模较小,且没有特殊处理,只是简单的修改父节点,所以可以用朴素的不带路径压缩的find函数
JSOI2008 最小生成树计数的更多相关文章
- bzoj1016 [JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 3517 Solved: 1396[Submit][St ...
- BZOJ 1016: [JSOI2008]最小生成树计数( kruskal + dfs )
不同最小生成树中权值相同的边数量是一定的, 而且他们对连通性的贡献是一样的.对权值相同的边放在一起(至多10), 暴搜他们有多少种方案, 然后乘法原理. ----------------------- ...
- 1016: [JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 6200 Solved: 2518[Submit][St ...
- 【BZOJ 1016】 1016: [JSOI2008]最小生成树计数 (DFS|矩阵树定理)
1016: [JSOI2008]最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树 ...
- 【bzoj1016】[JSOI2008]最小生成树计数
1016: [JSOI2008]最小生成树计数 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4863 Solved: 1973[Submit][St ...
- bzoj1016: [JSOI2008]最小生成树计数(kruskal+dfs)
1016: [JSOI2008]最小生成树计数 题目:传送门 题解: 神题神题%%% 据说最小生成树有两个神奇的定理: 1.权值相等的边在不同方案数中边数相等 就是说如果一种方案中权值为1的边有n条 ...
- 【bzoj1016】 JSOI2008—最小生成树计数
http://www.lydsy.com/JudgeOnline/problem.php?id=1016 (题目链接) 题意 求图的最小生成树计数. Solution %了下题解,发现要写矩阵树,15 ...
- [BZOJ]1016 JSOI2008 最小生成树计数
最小生成树计数 题目描述 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小生成树就是不同 ...
- 【BZOJ】1016: [JSOI2008]最小生成树计数 深搜+并查集
最小生成树计数 Description 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一条边不同,则这两个最小 ...
- BZOJ.1016.[JSOI2008]最小生成树计数(Matrix Tree定理 Kruskal)
题目链接 最小生成树有两个性质: 1.在不同的MST中某种权值的边出现的次数是一定的. 2.在不同的MST中,连接完某种权值的边后,形成的连通块的状态是一样的. \(Solution1\) 由这两个性 ...
随机推荐
- ubuntu1304下安装boa服务器
本测试在ubuntu1304下测试,具体步骤如下: 1下载源码:www.boa.org,可在ubuntu下自带的火狐浏览器下载,也可在window下下载,然后再移到ubuntu下: 2打开终端,将bo ...
- .NET基础之迭代器
使用foreach循环是有IEnumerator接口来实现的,IEnumerator即实现了迭代器,在foreach中如何迭代一个集合arrayList呢? 调用arrayLis.GetEnumber ...
- CodeForces 18C
Description Once Bob took a paper stripe of n squares (the height of the stripe is 1 square). In eac ...
- 【go】脑补框架 Express beego tornado Flux reFlux React jsx jpg-ios出品
http://goexpresstravel.com/ 今天 Express 的作者 TJ Holowaychuk 发了一篇文章,正式宣告和 Node.js 拜拜了,转向 Go 语言. Go vers ...
- python logging 日志轮转文件不删除问题
前言 最近在维护项目的python项目代码,项目使用了 python 的日志模块 logging, 设定了保存的日志数目, 不过没有生效,还要通过contab定时清理数据. 分析 项目使用了 logg ...
- Unity3d中所有特殊的文件夹
1.Editor Editor文件夹可以在根目录下,也可以在子目录里,只要名子叫Editor就可以.比如目录:/xxx/xxx/Editor 和 /Editor 是一样的,无论多少个叫Editor的 ...
- 预告:准备开个坑,集中学习一下esp32模块
对这个模块有兴趣的可以关注我以后的更新,寒假会抽空写几篇心得.
- 简单3d RPG游戏 之 004 攻击(二)
人物和怪物的攻击都有CD冷却,在PlayerAttack脚本中添加成员 //冷却倒计时 public float attackTimer; //CD冷却时间 public float coolDown ...
- Notepad++ 书签
Notepad++,有一个书签功能,指定书签是Ctrl+F2,在书签之间移动是按F2来切换,这个可以在几个想查看的数据之间进行快速切换,所以看起来就很方便.
- Eat the Trees hdu 1693
Problem DescriptionMost of us know that in the game called DotA(Defense of the Ancient), Pudge is a ...