1 条题解

  • 0
    @ 2025-2-21 19:55:52

    C++ :

    /*
    	author :hzoi_ztx
    	title  :
    	ALG    :
    	comment:
    
    	[2014 10 16 test]
    */
    
    #include <cstdio>
    
    #define  maxn  102
    #define  sig   -1
    
    int n , m , g[maxn][maxn] ;
    double p[maxn][maxn] , ans[maxn] , tmp ;
    
    int main() {
    	//#define READ
    	#ifdef  READ
    		freopen("friend.in" ,"r",stdin ) ;
    		freopen("friend.out","w",stdout) ;
    	#endif
    	//in
    	int i , j , k , t ;
    	scanf("%d%d", &n , &m ) ;
    	for (i = 1 ; i <= n ; i ++ ) {
    		for (j = 1 ; j <= n ; j ++ ) {
    			p[i][j] = 1 ; g[i][j] = sig ;
    		}
    		ans[i] = 0 ;
    	}
    	while (m -- ) {
    		scanf("%d%d%d", &i , &j , &k ) ;
    		g[i][j] = g[j][i] = k ;
    	}
    	//求最短路 
    	for (k = 1 ; k <= n ; k ++ ) {
    		for (i = 1 ; i <= n ; i ++ ) {
    			if (k == i) continue ;
    			for (j = 1 ; j <= n ; j ++ ) {
    				if (i == j || j == k) continue ;
    				if (g[i][k] == sig || g[k][j] == sig) continue ;
    				t = g[i][k]+g[k][j] ; tmp = p[i][k]*p[k][j] ;
    				if (g[i][j] == sig || g[i][j] > t) {
    					g[i][j] = t ; p[i][j] = tmp ;
    				}
    				else if (g[i][j] == t) p[i][j] += tmp ;
    			}
    		}
    	}
    	//计算答案 
    	for (k = 1 ; k <= n ; k ++ ) {
    		for (i = 1 ; i <= n ; i ++ ) {
    			if (i == k) continue ;
    			for (j = 1 ; j <= n ; j ++ ) {
    				if (j==k || i==j) continue ;
    				if (g[i][j] == g[i][k]+g[k][j])
    					ans[k] += p[i][k]*p[k][j]/p[i][j] ;
    			}
    		}
    	}
    	//out
    	for (i = 1 ; i <= n ; i ++ )
    		printf("%.3f\n", ans[i] ) ;
    	return 0 ;
    }
    
    • 1

    信息

    ID
    994
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者