博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
1491: [NOI2007]社交网络
阅读量:6820 次
发布时间:2019-06-26

本文共 2182 字,大约阅读时间需要 7 分钟。

1491: [NOI2007]社交网络

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

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小心跪掉。。。)
 
1 var 2    i,j,k,l,m,n,s,t:longint; 3    a,b:array[0..150,0..150] of int64; 4    c:array[0..150] of int64; 5    d:array[0..150] of extended; 6 begin 7      readln(n,m); 8      fillchar(a,sizeof(a),0); 9      fillchar(b,sizeof(b),0);10      for i:=1 to n do b[i,i]:=1;11      for i:=1 to m do12          begin13               readln(j,k,l);14               a[j,k]:=l;a[k,j]:=l;15               b[j,k]:=1;b[k,j]:=1;16          end;17      for k:=1 to n do18          for i:=1 to n do19              begin20                   if (i<>k) and (a[i,k]>0) then21                      begin22                           for j:=1 to n do23                               begin24                                    if (i<>j) and (j<>k) and (a[k,j]>0) then25                                       begin26                                            if ((a[k,j]+a[i,k])=a[i,j]) then27                                               begin28                                                    b[i,j]:=b[i,j]+(b[i,k]*b[k,j]);29                                               end30                                            else31                                                begin32                                                     if ((a[k,j]+a[i,k])
a[s,t] then continue;52 d[i]:=d[i]+(b[s,i]*b[i,t])/b[s,t];53 end;54 end;55 for i:=1 to n do writeln(d[i]:0:3);56 end.

 

转载于:https://www.cnblogs.com/HansBug/p/4176833.html

你可能感兴趣的文章
sed处理变量替换
查看>>
Netsh Diag
查看>>
win8
查看>>
AIX 安装 SVN 客户端 完整过程 subversion-1.8
查看>>
8-17 页面分页
查看>>
数据库--sqlite的操作
查看>>
手机号码 正则
查看>>
如何解酷派CPB包
查看>>
Linux 安装JDK,配置JAVA环境变量
查看>>
jenkins插件之小白的笔记
查看>>
html meta中的viewport指令
查看>>
windows 2008的安装
查看>>
Unity3D研究院之手游开发中所有特殊的文件夹(assetbundle与Application.persistentDataPath)...
查看>>
[DeviceOne开发]-手势动画示例分享
查看>>
《Activiti实战》读书笔记——5.1.4
查看>>
Linux文件管理类命令
查看>>
Kuerbernetes 1.11 二进制安装
查看>>
SpringMVC异步处理之@Async(附源代码 - 单元测试通过)
查看>>
undefined reference to 'pthread_setspecific '
查看>>
MediaBrowserService 音乐播放项目--IT蓝豹
查看>>