bzoj1491【NOI2007】社交网络

1491: [NOI2007]社交网络

Time Limit: 10 Sec   Memory Limit: 64 MB
Submit: 1234   Solved: 702
[ Submit][ Status][ Discuss]

Description

Input

bzoj1491【NOI2007】社交网络_第1张图片

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



Floyd算法的变形。用g[i][j]表示i到j最短路径的条数,状态转移详见代码......




#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define F(i,j,n) for(int i=j;i<=n;i++)
#define D(i,j,n) for(int i=j;i>=n;i--)
#define LL long long
#define pa pair<int,int>
#define MAXN 105
#define INF 1000000000
using namespace std;
int n,m,x,y;
double z,ans,f[MAXN][MAXN],g[MAXN][MAXN];
int read()
{
	int ret=0,flag=1;char ch=getchar();
	while (ch<'0'||ch>'9') {if (ch=='-') flag=-1;ch=getchar();}
	while (ch>='0'&&ch<='9') {ret=ret*10+ch-'0';ch=getchar();}
	return ret*flag;
}
int main()
{
	n=read();
	m=read();
	F(i,1,n) F(j,1,n) f[i][j]=INF;
	F(i,1,n) F(j,1,n) g[i][j]=0;
	F(i,1,m)
	{
		x=read();y=read();
		scanf("%lf",&z);
		f[x][y]=f[y][x]=min(f[x][y],z);
		g[x][y]=g[y][x]=1;
	}
	F(k,1,n) F(i,1,n) F(j,1,n)
	{
		if (i==k||j==k||i==j) continue;
		if (f[i][k]+f[k][j]==f[i][j]) g[i][j]+=g[i][k]*g[k][j];
		else if (f[i][k]+f[k][j]<f[i][j])
		{
			f[i][j]=f[i][k]+f[k][j];
			g[i][j]=g[i][k]*g[k][j];
		}
	}
	F(k,1,n)
	{
		ans=0;
		F(i,1,n) F(j,1,n)
		{
			if (i==k||j==k||i==j) continue;
			if (f[i][k]+f[k][j]==f[i][j]&&g[i][j]>0) ans+=g[i][k]*g[k][j]/g[i][j];
		}
		printf("%.3lf\n",ans);
	}
}


你可能感兴趣的:(bzoj)