记录编号 403458 评测结果 AAAAAAAAAA
题目名称 [NOI 2007]社交网络 最终得分 100
用户昵称 Gravatar再见 是否通过 通过
代码语言 C++ 运行时间 0.071 s
提交时间 2017-05-10 13:52:04 内存使用 0.93 MiB
显示代码纯文本
#include <cstdio>
#include <cstdlib>
#include <cstring>
typedef long long LL;

int n,m,tot,head[110],next[10010],to[10010],val[10010];
int dis[110],Q[100100],qhead,tail,inq[110],sdisv[110][110];
LL stov[110][110],cnt[110];

void add(int u,int v,int w){
	++tot; to[tot]=v; val[tot]=w;
	next[tot]=head[u]; head[u]=tot;
}

void SPFA(int s){
	memset(dis,0x7f,sizeof(dis));
	memset(cnt,0,sizeof(cnt));
	memset(inq,0,sizeof(inq));
	cnt[s]=1; dis[s]=0;
	for(int i=1;i<=n;i++){
		int u=0;
		for(int j=1;j<=n;j++){
			if(!inq[j]&&!u) u=j;
			if(dis[u]>dis[j]&&!inq[j]) u=j;
		}
		inq[u]=true;
		for(int p=head[u];p;p=next[p])
			if(dis[to[p]]>dis[u]+val[p]){
				dis[to[p]]=dis[u]+val[p];
				cnt[to[p]]=cnt[u];
			}
			else if(dis[to[p]]==dis[u]+val[p])
				cnt[to[p]]+=cnt[u];
	}
}

int main(){
	//freopen("in.in","r",stdin);
	freopen("network1.in","r",stdin);
	freopen("network1.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++){
		int x,y,z; scanf("%d%d%d",&x,&y,&z);
		add(x,y,z); add(y,x,z);
	}
	for(int i=1;i<=n;i++){
		SPFA(i);
		for(int j=1;j<=n;j++){
			stov[i][j]=cnt[j];
			sdisv[i][j]=dis[j];
		}
	}
	for(int v=1;v<=n;v++){
		double ans=0;
		for(int s=1;s<=n;s++)
			for(int t=1;t<=n;t++)
				if(s!=v&&t!=v&&s!=t&&sdisv[s][v]+sdisv[v][t]==sdisv[s][t])
					ans+=(double)stov[s][v]*stov[v][t]/(double)stov[s][t];
		printf("%.3lf\n",ans);
	}
	return 0;
}