1491: [NOI2007]社交网络

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 881  Solved: 518
[Submit][Status]

Description

Input

Output

输出文件包括n 行,每行一个实数,精确到小数点后3 位。第i 行的实数表 示结点i 在社交网络中的重要程度。

Sample Input

4 4
1 2 1
2 3 1
3 4 1
4 1 1

Sample Output

1.000
1.000
1.000
1.000

HINT


为1

Source

 题解:这个嘛,我还是小小地逗比了一下(phile:汗 HansBug:T_T)——题目中说每次求出来的是s到t最短路径中经过v点的路径所占的比例,但是我还是当作占经过各点路径之和的比例了(phile:那不是重复计算了嘛 HansBug:么么哒)。。。然后说思路——其实这道题的思想有点类似于Bzoj1638(奶牛交通),通过求出各个部分的局部值来进行组合求解——在Floyd过程中,当a[i,j]=a[i,k]+a[k,j]时,则用于存储数量的b[i,j]:=b[i,j]+b[i,k]*b[k,j](简单乘法原理),当a[i,j]>a[i,k]+a[k,j](即最短路径长度被刷新时),则b[i,j]:=b[i,k]*b[k,j];然后这样字O(n^3)(N<=100呢怕啥)处理完,然后再来个O(n^3)负责统计即可。。。(HansBug:记得开int64/long long啊!!!题目中最短路径数是<=10^10,要是longint小心跪掉。。。)
 
 var
i,j,k,l,m,n,s,t:longint;
a,b:array[..,..] of int64;
c:array[..] of int64;
d:array[..] of extended;
begin
readln(n,m);
fillchar(a,sizeof(a),);
fillchar(b,sizeof(b),);
for i:= to n do b[i,i]:=;
for i:= to m do
begin
readln(j,k,l);
a[j,k]:=l;a[k,j]:=l;
b[j,k]:=;b[k,j]:=;
end;
for k:= to n do
for i:= to n do
begin
if (i<>k) and (a[i,k]>) then
begin
for j:= to n do
begin
if (i<>j) and (j<>k) and (a[k,j]>) then
begin
if ((a[k,j]+a[i,k])=a[i,j]) then
begin
b[i,j]:=b[i,j]+(b[i,k]*b[k,j]);
end
else
begin
if ((a[k,j]+a[i,k])<a[i,j]) or (a[i,j]=) then
begin
a[i,j]:=a[k,j]+a[i,k];
b[i,j]:=b[i,k]*b[k,j];
end;
end;
end;
end;
end;
end;
fillchar(d,sizeof(d),);
for s:= to n do
for t:= to n do
begin
if s=t then continue;
fillchar(c,sizeof(c),);
for i:= to n do
begin
if (s=i) or (t=i) then continue;
if (a[s,i]+a[i,t])<>a[s,t] then continue;
d[i]:=d[i]+(b[s,i]*b[i,t])/b[s,t];
end;
end;
for i:= to n do writeln(d[i]::);
end.
04-28 07:46