zoukankan      html  css  js  c++  java
  • 【Codeforces】113 D. Museum

    题解

    我们设(f(i,j))((i,j))这个点期望被经过多少次
    我们可以列出方程组来消元,由于终点只会被经过0次或者1次,期望就是概率
    对于起点的话我们期望经过次数多加一个1
    复杂度(O(n^6))

    代码

    #include <iostream>
    #include <cstdio>
    #include <vector>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    #include <map>
    //#define ivorysi
    #define pb push_back
    #define space putchar(' ')
    #define enter putchar('
    ')
    #define mp make_pair
    #define pb push_back
    #define fi first
    #define se second
    #define mo 974711
    #define RG register
    #define MAXN 200005
    using namespace std;
    typedef long long int64;
    typedef double db;
    template<class T>
    void read(T &res) {
        res = 0;char c = getchar();T f = 1;
        while(c < '0' || c > '9') {
    	if(c == '-') f = -1;
    	c = getchar();
        }
        while(c >= '0' && c <= '9') {
    	res = res * 10 + c - '0';
    	c = getchar();
        }
        res *= f;
    }
    template<class T>
    void out(T x) {
        if(x < 0) putchar('-'),x = -x;
        if(x >= 10) out(x / 10);
        putchar('0' + x % 10);
    }
    int g[25][25],ind[25];
    int N,M,a,b;
    db P[25],f[505][505],ans[505];
    int get_id(int x,int y) {
        return (x - 1) * N + y;
    }
    void Guass() {
        int T = N * N;
        for(int i = 1 ; i <= T ; ++i) {
    	int l = i;
    	for(int j = i ; j <= T ; ++j) if(fabs(f[l][i]) < fabs(f[j][i])) l = j;
    	if(l != i) {
    	    for(int j = 1 ; j <= T ; ++j) swap(f[l][j],f[i][j]);
    	}
    	for(int j = i + 1 ; j <= T ; ++j) {
    	    db t = f[j][i] / f[i][i];
    	    for(int k = i ; k <= T + 1; ++k) {
    		f[j][k] -= t * f[i][k];
    	    }
    	}
        }
        for(int i = T ; i >= 1 ; --i) {
    	for(int j = i + 1 ; j <= T ; ++j) {
    	    f[i][T + 1] -= f[i][j] * ans[j];
    	}
    	ans[i] = f[i][T + 1] / f[i][i];
        }
    }
    void Solve() {
        read(N);read(M);read(a);read(b);
        int u,v;
        for(int i = 1 ; i <= M ; ++i) {
    	read(u);read(v);
    	ind[u]++;ind[v]++;
    	g[u][v] = g[v][u] = 1;
        }
        for(int i = 1 ; i <= N ; ++i) scanf("%lf",&P[i]);
        for(int i = 1 ; i <= N ; ++i) {
    	for(int j = 1 ; j <= N ; ++j) {
    	    int t = get_id(i,j);
    	    if(i == a && j == b) f[t][N * N + 1] += 1.0;
    	    f[t][t] += 1.0;
    	    for(int k = 1 ; k <= N ; ++k) {
    		if(k != i && !g[i][k]) continue;
    		for(int h = 1 ; h <= N ; ++h) {
    		    if(j != h && !g[j][h]) continue;
    		    if(k == h) continue;
    		    db tmp = 1.0;
    		    if(i == k) tmp *= P[i];
    		    else tmp *= (1 - P[k]) / ind[k];
    		    if(j == h) tmp *= P[h];
    		    else tmp *= (1 - P[h]) / ind[h];
    		    f[t][get_id(k,h)] += -tmp;
    		}
    	    }
    	}
        }
        Guass();
        for(int i = 1 ; i <= N ; ++i) {
    	printf("%.8lf ",ans[get_id(i,i)]);
        }
        enter;
    }
    int main() {
    #ifdef ivorysi
        freopen("f1.in","r",stdin);
    #endif
        Solve();
        return 0;
    }
    
  • 相关阅读:
    Android 主题theme说明 摘记
    Android开发 去掉标题栏方法 摘记
    安卓项目五子棋代码详解(二)
    关于 ake sure class name exists, is public, and has an empty constructor that is public
    百度地图3.0实现图文并茂的覆盖物
    android onSaveInstanceState()及其配对方法。
    关于集成科大讯飞语音识别的 一个问题总结
    android 关于 webview 控制其它view的显示 以及更改view数据失败的问题总结
    C# 解析 json Newtonsoft果然强大,代码写的真好
    c#数据类型 与sql的对应关系 以及 取值范围
  • 原文地址:https://www.cnblogs.com/ivorysi/p/9114725.html
Copyright © 2011-2022 走看看