您的位置:首页 > 理论基础 > 计算机网络

bzoj 1491: [NOI 2007]社交网络

2014-01-05 19:06 99 查看
这道题一开始自己本来想出来了。。

结果自己又把自己推翻了。。于是看题解和自己一样。

还好刘教授帮我解释了一下floyd对于一条最短路只会判一次在K=这条路径上最大的那个点的时候。

后面又因为滥用memset(f,127,sizeof(f))导致f[i][k] + f[j][k]会爆所以wa掉了

喜闻乐见地贴代码:

/*
ID:WULALA
PROB:bzoj1491
LANG:C++
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <fstream>
#include <ctime>
#define N 108
#define M
#define mod
#define mid(l,r) ((l+r) >> 1)
#define INF 0x7ffffff
using namespace std;

long long n,m,f

,sum

;
double w
;

void init()
{
scanf("%lld%lld",&n,&m);
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
sum[i][j] = 1,f[i][j] = INF;
for (int i = 1;i <= n;i++) f[i][i] = 0;
for (int i = 1;i <= m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
f[a][b] = f[b][a] = c;
}
}

void floyd()
{
for (int k = 1;k <= n;k++)
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
{
if (k == i||i == j||j == k) continue;
if (f[i][j] == f[i][k] + f[k][j]) sum[i][j] += sum[i][k] * sum[k][j];
else if (f[i][j] > f[i][k] + f[k][j]) f[i][j] = f[i][k] + f[k][j],sum[i][j] = sum[i][k] * sum[k][j];
}
}

void work()
{
for (int k = 1;k <= n;k++)
for (int i = 1;i <= n;i++)
for (int j = 1;j <= n;j++)
{
if (k == i||i == j||j == k) continue;
if (f[i][j] == f[i][k] + f[k][j])
w[k] += (double)(sum[i][k] * sum[k][j]) / (double)(sum[i][j]);
}
}

int main()
{
init();
floyd();
work();
for (int i = 1;i <= n;i++)
printf("%.3lf\n",w[i]);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: