pku2421 Constructing Roads

求一个图的最小生成树,其中某些边不收费(可以这样理解)。

这次用kruscal打的,对于不收费的边先全部加入,再维护即可。

View Code
  1 program pku2421(input,output);
2 var
3 father : array[0..200] of longint;
4 f : array[0..200,0..200] of longint;
5 x,y,w : array[0..40000] of longint;
6 n,m,q,answer : longint;
7 procedure init;
8 var
9 i,j : longint;
10 begin
11 readln(n);
12 for i:=1 to n do
13 father[i]:=i;
14 m:=0;
15 for i:=1 to n do
16 begin
17 for j:=1 to n do
18 begin
19 read(f[i,j]);
20 if (i<=j)and(f[i,j]<>0) then
21 begin
22 inc(m);
23 x[m]:=i;
24 y[m]:=j;
25 w[m]:=f[i,j];
26 end;
27 end;
28 readln;
29 end;
30 end; { init }
31 procedure swap(var aa,bb :longint );
32 var
33 tt : longint;
34 begin
35 tt:=aa;
36 aa:=bb;
37 bb:=tt;
38 end; { swap }
39 procedure sort(p,q :longint );
40 var
41 i,j,mm : longint;
42 begin
43 i:=p;
44 j:=q;
45 mm:=w[(i+j)>>1];
46 repeat
47 while w[i]<mm do
48 inc(i);
49 while w[j]>mm do
50 dec(j);
51 if i<=j then
52 begin
53 swap(w[i],w[j]);
54 swap(x[i],x[j]);
55 swap(y[i],y[j]);
56 inc(i);
57 dec(j);
58 end;
59 until i>j;
60 if i<q then sort(i,q);
61 if j>p then sort(p,j);
62 end; { sort }
63 function getfather(x :longint ):longint;
64 begin
65 if father[x]=x then
66 exit(x);
67 father[x]:=getfather(father[x]);
68 exit(father[x]);
69 end; { getfather }
70 function check():boolean;
71 var
72 i : longint;
73 begin
74 for i:=2 to n do
75 if getfather(1)<>getfather(i) then
76 exit(false);
77 exit(true);
78 end; { check }
79 procedure main;
80 var
81 i : longint;
82 xx,yy : longint;
83 begin
84 readln(q);
85 for i:=1 to q do
86 begin
87 readln(xx,yy);
88 xx:=getfather(xx);
89 yy:=getfather(yy);
90 if xx<>yy then
91 father[xx]:=yy;
92 end;
93 for i:=1 to m do
94 begin
95 xx:=getfather(x[i]);
96 yy:=getfather(y[i]);
97 if xx=yy then
98 continue
99 else
100 begin
101 inc(answer,w[i]);
102 father[xx]:=yy;
103 if check then
104 break;
105 end;
106 end;
107 writeln(answer);
108 end; { main }
109 begin
110 init;
111 sort(1,m);
112 main;
113 end.



转载于:https://www.cnblogs.com/neverforget/archive/2012/03/17/2402973.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值