好吧先不吐槽这道题的题目是一部介绍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 }
好了其实这题并不难,黄学长他们的题解看上去就比我先进多了
orzhzw,orzzld。
这是我在BZOJ AC的除A+B外的第一题,以此纪念。 2015/5/24
时间: 2024-11-09 06:47:57