题目描述Description
Kerry 是德国的一位电缆商人。因联合国脱贫计划的邀请,他准备负责在土鲁齐亚埃萨亚克斯乌托斯邦建立电缆网络,以满足这个国家的用电需求。当然,现在土鲁齐亚埃萨亚克斯乌托斯邦没有任何电缆。已知土鲁齐亚埃萨亚克斯乌托斯邦一共有n个城镇,已经编号为1到n。其中任意两个城镇可能有一条路,也可能没有。如果两个城镇之间有一条路pi,那么这条路有一个长度si,则Kerry可以在这两个城市之间建立一条电缆线,电缆线的长度也就是这条路的长度si。
现在Kerry准备了s长的电缆线,电缆线可以任意拆断,拆断不损失任何电缆线。他需要将土鲁齐亚埃萨亚克斯乌托斯邦所有城镇都能够连入这个电缆网络。那么,Kenny能不能使用这s长度的电缆线完成这项工作;如果能够完成,那么Kerry最少耗用多少长度的电缆线呢?
输入格式Input Format
第一行一个正实数S;
第二行一个正整数n;
接下来一共有m行,第i行有两个整数xi,yi和一个实数si,表示编号为xi个村庄和编号为yi个村庄之间有一条路,路的长度为si。
输入保证xi不等于yi,两个城镇之间不会有两条路。
输出格式Output Format
若能够完成(建立这样的电缆网络),则输出(其中<X>代表最少的电缆线长度,保留两位小数):
Need <X>miles of cable
否则输出:
Impossible
样例输入:
100.0
4
1 2 2.0
1 3 4.2
1 4 6.7
3 4 4.0
2 4 10.0
样例输出:
Need 10.20 miles of cable
数据规模
1 <=n,m<=100000
分析:其实拿过来题目就可以知道这是个最小生成树的算法,可是看一下范围 结点n<=100000,用prim的朴素算法肯定会爆栈的,如果非的使用prim的话,还需要用堆进行优化,我反正写不了。鉴于以上情况,我使用了比较简单的kruskal算法,快排加上并查集,立马搞定!
代码:
代码
1 program town;
2 type atype=record
3 x,y:longint;
4 quan:real;
5 end;
6 var n,k:longint; ans,s:real;
7 a:array[0..1000000]of atype;
8 father:array[0..100000]of longint;
9 f:array[1..100000]of boolean;
10 tf:boolean;
11
12 procedure qsort(l,r:longint);
13 var i,j:longint; x:real; temp:atype;
14 begin
15 i:=l;
16 j:=r;
17 x:=a[(i+j)div 2].quan;
18 repeat
19 begin
20 while a[i].quan<x do inc(i);
21 while a[j].quan>x do dec(j);
22 if i<=j then
23 begin
24 temp:=a[i];
25 a[i]:=a[j];
26 a[j]:=temp;
27 inc(i);
28 dec(j);
29 end;
30 end;
31 until i>j;
32 if i<r then qsort(i,r);
33 if j>l then qsort(l,j);
34 end;
35
36 function getfather(t:longint):longint;
37 begin
38 if father[t]=0 then exit(t);
39 father[t]:=getfather(father[t]);
40 getfather:=father[t];
41 end;
42
43 procedure init;
44 var x,y,i:longint; z:real;
45 begin
46 assign(input,'town.in');
47 reset(input);
48 assign(output,'town.out');
49 rewrite(output);
50 fillchar(f,sizeof(f),false);
51 readln(s);
52 readln(n);
53 for i:=1 to n do
54 father[i]:=i;
55 k:=0;
56 while not seekeof do
57 begin
58 inc(k);
59 read(x,y,z);
60 a[k].x:=x;
61 a[k].y:=y;
62 a[k].quan:=z;
63 f[x]:=true;
64 f[y]:=true;
65 end;
66 close(input);
67 for i:=1 to n do
68 if not f[i] then
69 begin
70 writeln('Impossible');
71 close(output);
72 halt;
73 end;
74 end;
75
76 procedure main;
77 var i,j,f1,f2:longint;
78 begin
79 qsort(1,k);
80 i:=1;
81 ans:=0;
82 fillchar(father,sizeof(father),0);
83 for j:=1 to n-1 do
84 begin
85 while getfather(a[i].x)=getfather(a[i].y) do
86 inc(i);
87 f1:=getfather(a[i].x);
88 f2:=getfather(a[i].y);
89 father[f2]:=f1;
90 ans:=ans+a[i].quan;
91 end;
92 if ans<=s then
93 writeln('Need ',ans:0:2,' miles of cable')
94 else
95 writeln('Impossible');
96 end;
97
98 begin
99 init;
100 main;
101 close(output);
102 end.
103
104

浙公网安备 33010602011771号