[BZOJ 1491] [NOI 2007] 社交网络

好吧先不吐槽这道题的题目是一部介绍facebook的电影……

1491: [NOI2007]社交网络

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1010  Solved: 584
[Submit][Status][Discuss]

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




【题解】

首先,这肯定是最短路问题。
看到n<=100,又要求所有点对间的最短路,想到用floyd。
在floyd的时候加上计数即可。
注意:这个计数要应用乘法原理、加法原理;
最后根据I的公式推导出重要程度。
时间复杂度:O(2*n^3+n),即O(n^3),在n=100极限数据并不会爆
贴上代码咯
值得注意的是,这题需要判一下自环,我之前把ans数组设成int了,导致我全部输出0.000 TAT 以后写代码要注意了,不然会浪费挺多时间的。
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN=100+20,INF=20000001;
 4 double a[MAXN][MAXN];
 5 double mapx[MAXN][MAXN],ans[MAXN];
 6 int n,m;
 7 int main() {
 8     scanf("%d%d",&n,&m);
 9     for (int i=1;i<=n;++i)
10         for (int j=1;j<=n;++j) mapx[i][j]=mapx[j][i]=INF;
11     for (int i=1;i<=m;++i) {
12         int f,t; double w;
13         scanf("%d%d%lf",&f,&t,&w);
14         mapx[f][t]=mapx[t][f]=w;
15         a[f][t]=a[t][f]=1;
16     }
17     for (int k=1;k<=n;++k)
18         for (int i=1;i<=n;++i)
19             for (int j=1;j<=n;++j) {
20                 if(mapx[i][k]+mapx[k][j]<mapx[i][j]) {
21                     mapx[i][j]=mapx[i][k]+mapx[k][j];
22                     a[i][j]=a[i][k]*a[k][j];
23                 }
24                 else if(mapx[i][k]+mapx[k][j]==mapx[i][j]) a[i][j]+=a[i][k]*a[k][j];
25             }
26 
27     for (int i=1;i<=n;++i) a[i][i]=0;
28     for (int k=1;k<=n;++k)
29         for (int i=1;i<=n;++i)
30             for (int j=1;j<=n;++j)
31                 if(mapx[i][j]==mapx[i][k]+mapx[k][j] && a[i][j]>0) ans[k]+=a[i][k]*a[k][j]/a[i][j];
32     for (int i=1;i<=n;++i)
33         printf("%.3lf\n",ans[i]);
34     return 0;                
35 }
View Code

好了其实这题并不难,黄学长他们的题解看上去就比我先进多了

orzhzw,orzzld。

这是我在BZOJ AC的除A+B外的第一题,以此纪念。 2015/5/24

 
 
posted @ 2015-05-24 16:06  TonyFang  阅读(186)  评论(0编辑  收藏  举报