【期望DP+高斯消元】 UVA 10828 Back to Kernighan-Ritchie

通道

题意:从1开始 每次等概率从一个点到和他相邻的点 有向 走到不能走停止 求停止时每个点的期望

思路:白书P156

代码:

#include <cstdio>  
#include <cstring>  
#include <cmath>  
#include <vector>  
using namespace std;  
  
const int N = 105;  
const double eps = 1e-9;  
int n, d[N], inf[N];  
double a[N][N];  
vector<int> pre[N];  
  
void build() {  
    int u, v;  
    memset(d, 0, sizeof(d));  
    for (int i = 0; i < n; i++)  
    pre[i].clear();  
    while (~scanf("%d%d", &u, &v) && u) {  
    u--; v--; d[u]++;  
    pre[v].push_back(u);  
    }  
    memset(a, 0, sizeof(a));  
    for (int i = 0; i < n; i++) {  
    a[i][i] = 1;  
    for (int j = 0; j < pre[i].size(); j++)  
        a[i][pre[i][j]] = -1.0 / d[pre[i][j]];  
    if (i == 0) a[i][n] = 1;  
    }  
}  
  
void gauss() {  
    for (int i = 0; i < n; i++) {  
    int k = i;  
    for (;k < n; k++)  
        if (fabs(a[k][i]) > eps) break;  
    if (k == n) continue;  
    for (int j = 0; j <= n; j++) swap(a[k][j], a[i][j]);  
    for (int j = 0; j < n; j++) {  
        if (i == j) continue;  
        if (fabs(a[k][i]) > eps) {  
        double x = a[j][i] / a[i][i];  
        for (int k = i; k <= n; k++)  
            a[j][k] -= x * a[i][k];  
        }  
    }  
    }  
}  
  
void get_inf() {  
    memset(inf, 0, sizeof(inf));  
    for (int i = n - 1; i >= 0; i--) {  
    if (fabs(a[i][i]) < eps && fabs(a[i][n]) > eps) inf[i] = 1;  
    for (int j = i + 1; j < n; j++)  
        if (fabs(a[i][j]) > eps && inf[j]) inf[i] = 1;  
    }  
}  
  
int main() {  
    int cas = 0;  
    while (~scanf("%d", &n) && n) {  
    build();  
    gauss();  
    get_inf();  
    int q, node;  
    scanf("%d", &q);  
    printf("Case #%d:\n", ++cas);  
    while (q--) {  
        scanf("%d", &node);  
        node--;  
        if (inf[node]) printf("infinity\n");  
        else printf("%.3lf\n", fabs(a[node][node]) < eps ? 0 : a[node][n] / a[node][node]);  
    }  
    }  
    return 0;  
}  
View Code

 

转载于:https://www.cnblogs.com/Rojo/p/4733320.html

内容概要:本文档详细介绍了计算机求职笔试的内容与解答,涵盖编程语言基础、数据结构与算法、编程实践与调试、系统设计与软件工程以及综合题型与开放题五个方面。编程语言基础部分强调了语法规则、数据类型与运算符、面向对象编程的核心概念;数据结构与算法部分讲解了常见数据结构(如线性结构、树与图、哈希表)和高频算法(如排序算法、动态规划、递归与回溯);编程实践与调试部分关注编码能力和调试技巧;系统设计与软件工程部分探讨了设计模式、模块化设计、数据库与网络知识;综合题型与开放题部分则提供了场景题和逻辑思维题的示例。最后给出了备考建议,包括知识体系构建、刷题策略和模拟实战的方法。 适合人群:即将参加计算机相关职位笔试的求职者,特别是对编程语言、数据结构、算法设计有初步了解的应届毕业生或初级工程师。 使用场景及目标:①帮助求职者系统复习计算机基础知识,提升笔试通过率;②通过例题和解答加深对编程语言、数据结构、算法的理解;③提供模拟实战环境,提高时间管理和抗压能力。 阅读建议:建议按照文档提供的知识体系顺序进行系统复习,重点攻克高频题型,利用在线平台刷题练习,并结合实际项目经验进行综合应用,同时注意时间管理和抗压能力的训练。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值