• BZOJ 1491 [NOI2007]社交网络


    题解:Floyd应用

    d[i][j]两点最短路

    c[i][j]两点最短路条数

    转移

    若d[i][k]+d[k][j]<d[i][j]则c[i][j]=c[i][k]*c[k][j]

    若d[i][k]+d[k][j]==d[i][j]则c[i][j]+=c[i][k]*c[k][j];

    统计答案时当d[s][v]+d[v][t]==d[s][t]则对答案有贡献c[s][v]*c[v][t]/c[s][t]

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=109;
    const int oo=1000000000;
    
    int n,m;
    
    int d[maxn][maxn];
    long long c[maxn][maxn];
    
    int main(){
    	scanf("%d%d",&n,&m);
    	
    	for(int i=1;i<=n;++i){
    		for(int j=1;j<=n;++j){
    			d[i][j]=oo;
    		}
    	}
    	for(int i=1;i<=n;++i)d[i][i]=0;
    	
    	while(m--){
    		int x,y,z;
    		scanf("%d%d%d",&x,&y,&z);
    		d[x][y]=d[y][x]=z;
    		c[x][y]=c[y][x]=1;
    	}
    	
    	for(int k=1;k<=n;++k){
    		for(int i=1;i<=n;++i){
    			for(int j=1;j<=n;++j){
    				if((i==j)||(i==k)||(j==k))continue;
    				if(d[i][k]+d[k][j]<d[i][j]){
    					d[i][j]=d[i][k]+d[k][j];
    					c[i][j]=c[i][k]*c[k][j];
    				}else if(d[i][k]+d[k][j]==d[i][j]){
    					c[i][j]+=c[i][k]*c[k][j];
    				}
    			}
    		}
    	}
    	
    	for(int k=1;k<=n;++k){
    		double ans=0;
    		for(int i=1;i<=n;++i){
    			for(int j=1;j<=n;++j){
    				if((i==j)||(i==k)||(j==k))continue;
    				if(d[i][k]+d[k][j]==d[i][j]){
    					ans+=1.0*c[i][k]*c[k][j]/c[i][j];
    				}
    			}
    		}
    		printf("%.3f
    ",ans);
    	}
    	return 0;
    }
    

      

    自己还是太辣鸡了
  • 相关阅读:
    在Windows Server 2008 R2上安装IIS服务
    Linux 系统化学习系列文章总目录(持续更新中)
    Oracle 11g一步步安装详解
    MySQL 菜鸟入门“秘籍”
    Linux下的/proc目录介绍
    Python查找文件
    Python对文件和文件路径的管理
    Python中执行外部命令
    Python处理命令行参数
    CentOS7--TigerVNC
  • 原文地址:https://www.cnblogs.com/zzyer/p/8476101.html
Copyright © 2020-2023  润新知