bzoj1778

高斯消元+矩阵的逆

来自popoqqq大神

求矩阵的逆:把I-T放在左边,P/Q*S放在右边,这样就形成了一个n*2n的矩阵,然后把左边高斯消元,右边就是求完逆的矩阵,其实就是ans,矩阵的逆跟乘法逆元是一样的,只不过是矩阵的逆元

然后输出a[i][n+1],事实上矩阵只有n*(n+1)

构造转移概率矩阵是a[u][v]=1.0/d[v]*(1-p/q),就是v->u的概率乘上在v不爆炸的概率

#include<bits/stdc++.h>
using namespace std;
const double eps = 1e-15;
const int N = 610;
int n, m;
double a[N][N];
double p, q, t;
vector<int> G[N];
void gauss_jordan()
{
    a[1][n + 1] = t;
    for(int i = 1; i <= n; ++i)
    {
        a[i][i] += 1.0;
        for(int j = 0; j < G[i].size(); ++j)
        {
            int u = G[i][j];
            a[i][u] -= (1.0 - t) / (double)(G[u].size());
        }
    }
    for(int now = 1; now <= n; ++now)
    {
        int x = now;
        for(int i = now; i <= n; ++i) if(fabs(a[i][now]) > fabs(a[x][now])) x = i;
        for(int i = 1; i <= n + 1; ++i) swap(a[now][i], a[x][i]);
        double t = a[now][now];
        for(int i = 1; i <= n + 1; ++i) a[now][i] /= t;
        for(int i = 1; i <= n; ++i) if(fabs(a[i][now]) > eps && now != i)
        {
            t = a[i][now];
            for(int j = 1; j <= n + 1; ++j) a[i][j] -= t * a[now][j];
        }
    }
    for(int i = 1; i <= n; ++i) printf("%.9f\n", a[i][n + 1]);
}
int main()
{
    scanf("%d%d%lf%lf", &n, &m, &p, &q);
    t = p / q;
    for(int i = 1; i <= m; ++i)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        G[u].push_back(v);
        G[v].push_back(u);
    }
    gauss_jordan();
    return 0;
}

时间: 2024-10-27 17:33:54

bzoj1778的相关文章

BZOJ1778 [Usaco2010 Hol]Dotp 驱逐猪猡

首先我们列出转移矩阵$M$,$M_{i, j} = \frac {1 - \frac{p} {q}} {deg[i]}$(i,j之间有边)or $M_{i, j} = 0$(i,j之间没边) 则这个矩阵$M_{i, j}$表示的是站在某个点$i$,下一次走到$j$且没有爆炸的概率 我们再看$M^n_{i, j}$,表示的站在某个点$i$,走$n$步以后到达$j$且没有爆炸的概率 故$M^n$的第一列代表了$1$号点到其他所有点的概率,设为列向量$A_n$,则$A_n = M^n * B$,其中$

【bzoj1778】[Usaco2010 Hol]Dotp 驱逐猪猡 矩阵乘法+概率dp+高斯消元

题目描述 奶牛们建立了一个随机化的臭气炸弹来驱逐猪猡.猪猡的文明包含1到N (2 <= N <= 300)一共N个猪城.这些城市由M (1 <= M <= 44,850)条由两个不同端点A_j和B_j (1 <= A_j<= N; 1 <= B_j <= N)表示的双向道路连接.保证城市1至少连接一个其它的城市.一开始臭气弹会被放在城市1.每个小时(包括第一个小时),它有P/Q (1 <= P <=1,000,000; 1 <= Q <

bzoj1778 驱赶猪猡/luogu2937 赶小猪

Description 一个无向图,节点1有一个炸弹,在每个单位时间内,有可能在这个节点炸掉,也有p/q的概率随机选择一条出去的路到其他的节点上.问最终炸弹在每个节点上爆炸的概率. bzoj权限题,题目大概是机翻? bzoj3270的双倍经验题(然而我大于小于分不清楚还WA了一发) //%std #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include&l