56,677
社区成员
发帖
与我相关
我的任务
分享
use school
drop table point;
create table point(
id int,
val int,
flag int,
fa int,
primary key (id)
);
drop table line;
create table line(
id int,
x int,
y int,
val int,
flag int,
primary key(id)
);
插入数据就不贴了,下面是Kruskal算法的sql代码,最终会输出最小生成树的所有边权重之和:
use school;
declare @i int;
declare @ans int;
select @i=count(*) from line;
set @ans = 0;
while @i>0
begin
declare @x int; declare @y int; declare @val int;
declare @min_val int; declare @id_line int;
select @min_val=min(val) from line where flag=0;
select top 1 @id_line=id from line where flag=0 and val=@min_val;
select @x=x,@y=y,@val=val from line where flag=0 and id = @id_line;
update line set flag=1 where id=@id_line;
declare @fa_x int; declare @fa_y int;
select @fa_x=fa from point where id = @x;
select @fa_y=fa from point where id = @y;
if (@fa_x!=@fa_y)
begin
update point set fa = @fa_x where fa = @fa_y;
set @ans = @ans + @min_val;
end
set @i = @i - 1;
end
print @ans;