2435: [Noi2011]道路修建

2435: [Noi2011]道路修建

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 2188  Solved: 639
[Submit][Status]

Description

在 W 星球上有 n 个国家。为了各自国家的经济发展,他们决定在各个国家
之间建设双向道路使得国家之间连通。但是每个国家的国王都很吝啬,他们只愿
意修建恰好 n – 1条双向道路。 每条道路的修建都要付出一定的费用, 这个费用等于道路长度乘以道路两端的国家个数之差的绝对值。例如,在下图中,虚线所示道路两端分别有 2 个、4个国家,如果该道路长度为 1,则费用为1×|2 – 4|=2。图中圆圈里的数字表示国家的编号。


由于国家的数量十分庞大,道路的建造方案有很多种,同时每种方案的修建
费用难以用人工计算,国王们决定找人设计一个软件,对于给定的建造方案,计
算出所需要的费用。请你帮助国王们设计一个这样的软件。

Input


输入的第一行包含一个整数n,表示 W 星球上的国家的数量,国家从 1到n
编号。接下来 n – 1行描述道路建设情况,其中第 i 行包含三个整数ai、bi和ci,表
示第i 条双向道路修建在 ai与bi两个国家之间,长度为ci。

 

Output

输出一个整数,表示修建所有道路所需要的总费用。

Sample Input


6
1 2 1
1 3 1
1 4 2
6 3 1
5 2 1

Sample Output


20

HINT

 



n = 1,000,000 1≤ai, bi≤n 

0 ≤ci≤ 10^6

 

 

Source

Day2

 

题解:其实就是个搜索,由于题目中给了一棵树,所以直接建树,然后求出每个点有多少子孙(算自己)。。。本身应该不难的,但是对于P党问题来了——BFS嘛,搞死了还是超时(坑爹的int64运算简直慢到哭);DFS呵呵直接爆栈不解释(对于C++党的linux下系统栈无限表示严重鄙视!!TT传送门 ),于是我还是壮烈的TLE了,求神犇帮助(不过程序算法应该没有问题,就是int64害得......)

BFS:

 1 type
 2     point=^node;
 3     node=record
 4                g,w:longint;
 5                next:point;
 6     end;
 7 
 8 var
 9    i,j,k,l,m,n:longint;ll:int64;
10    a:array[0..1000000of point;
11    c,b,d,e:array[0..1000500of longint;
12    p:point;
13 procedure add(x,y,z:longint);inline;
14           var
15              p:point;
16           begin
17                new(p);
18                p^.g:=y;
19                p^.w:=z;
20                p^.next:=a[x];
21                a[x]:=p;
22           end;
23 procedure bfs1;inline;
24           var
25              p:point;f,r:longint;
26           begin
27                b[1]:=1;d[1]:=1;
28                f:=1;r:=2;
29                while f<r do
30                      begin
31                           p:=a[d[f]];
32                           while p<>nil do
33                                 begin
34                                      if b[p^.g]=0 then
35                                         begin
36                                              b[d[f]]:=2;
37                                              b[p^.g]:=1;
38                                              c[p^.g]:=d[f];
39                                              d[r]:=p^.g;
40                                              inc(r);
41                                         end;
42                                      p:=p^.next;
43                                 end;
44                           inc(f);
45                      end;
46           end;
47 begin
48      readln(n);
49      for i:=1 to n do a[i]:=nil;
50      for i:=1 to n-1 do
51          begin
52               readln(j,k,l);
53               add(j,k,l);
54               add(k,j,l);
55          end;
56      fillchar(b,sizeof(b),0);ll:=0;
57      fillchar(c,sizeof(c),0);fillchar(d,sizeof(d),0);
58      bfs1;ll:=0;
59      for i:=n downto 1 do
60          begin
61               e[d[i]]:=1;
62               p:=a[d[i]];
63               while p<>nil do
64                     begin
65                          if p^.g<>c[d[i]] then
66                             begin
67                                  ll:=ll+int64(abs(e[p^.g]-(n-e[p^.g])))*int64(p^.w);
68                                  e[d[i]]:=e[d[i]]+e[p^.g];
69                             end;
70                          p:=p^.next;
71                     end;
72          end;
73      writeln(ll);
74      readln; end.       

 DFS:

 1 type
 2     point=^node;
 3     node=record
 4                g,w:longint;
 5                next:point;
 6     end;
 7 
 8 var
 9    i,j,k,l,m,n:longint;ll:int64;
10    a:array[0..1000000] of point;
11    c,b:array[0..1000000] of longint;
12 procedure add(x,y,z:longint);inline;
13           var
14              p:point;
15           begin
16                new(p);
17                p^.g:=y;
18                p^.w:=z;
19                p^.next:=a[x];
20                a[x]:=p;
21           end;
22 procedure dfs(x:longint);inline;
23           var
24              p:point;
25           begin
26                if b[x]=1 then exit;
27                p:=a[x];b[x]:=1;
28                while p<>nil do
29                      begin
30                           if b[p^.g]=0 then
31                              begin
32                                   dfs(p^.g);
33                                   ll:=ll+int64(int64(abs(int64(c[p^.g])-int64(int64(n)-int64(c[p^.g]))))*int64(p^.w));
34                                   c[x]:=c[x]+c[p^.g];
35                              end;
36                           p:=p^.next;
37                      end;
38           end;
39 begin
40      readln(n);
41      for i:=1 to n do
42          begin
43               c[i]:=1;
44               a[i]:=nil;
45          end;
46      for i:=1 to n-1 do
47          begin
48               readln(j,k,l);
49               add(j,k,l);
50               add(k,j,l);
51          end;
52      fillchar(b,sizeof(b),0);ll:=0;
53      dfs(1);
54      writeln(ll);
55 end.              
原文地址:https://www.cnblogs.com/HansBug/p/4198030.html