https://vjudge.net/problem/UVA-10828

裸高斯消元。。。

但是要判无解和无穷解。

当出现一个环时会无解,环上每个点只有一个出边。

#include<bits/stdc++.h>
using namespace std;
const int N = ;
const double eps = 1e-;
int n, q;
double a[N][N], d[N];
vector<int> G[N];
int mark[N];
void build()
{
a[][n + ] = -1.0;
for(int i = ; i <= n; ++i)
{
a[i][i] = -1.0;
for(int j = ; j < G[i].size(); ++j)
a[i][G[i][j]] += 1.0 / d[G[i][j]];
}
}
void gauss_jordan()
{
for(int now = ; now <= n; ++now)
{
int x = now;
for(int i = now + ; i <= n; ++i) if(fabs(a[i][now]) > fabs(a[x][now])) x = i;
if(fabs(a[x][now]) < eps) continue;
for(int i = ; i <= n + ; ++i) swap(a[now][i], a[x][i]);
double t = a[now][now];
for(int i = now; i <= n + ; ++i) a[now][i] /= t;
for(int i = ; i <= n; ++i) if(i != now)
{
double t = a[i][now];
for(int j = now; j <= n + ; ++j) a[i][j] -= a[now][j] * t;
}
}
}
int main()
{
int T = ;
while(scanf("%d", &n))
{
++T;
if(n == ) break;
memset(d, , sizeof(d));
memset(a, , sizeof(a));
memset(mark, , sizeof(mark));
while()
{
int a, b; scanf("%d%d", &a, &b);
if(a == && b == ) break;
G[b].push_back(a);
d[a] += 1.0;
}
build();
gauss_jordan();
for(int i = n; i; --i)
{
if(fabs(a[i][i]) < eps && fabs(a[i][n + ]) > eps)
mark[i] = ;
for(int j = i + ; j <= n; ++j) if(fabs(a[i][j]) > eps && mark[j]) mark[i] = ;
}
scanf("%d", &q);
printf("Case #%d:\n", T);
while(q--)
{
int x; scanf("%d", &x);
if(mark[x]) puts("infinity");
else if(fabs(a[x][x]) < eps) puts("0.000");
else printf("%.3f\n", fabs(a[x][n + ] / a[x][x]));
}
for(int i = ; i <= n; ++i) G[i].clear();
}
return ;
}

uva10828的更多相关文章

  1. UVA-10828 (概率期望+高斯消元)

    题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...

  2. UVa10828 Back to Kernighan-Ritchie——概率转移&&高斯消元法

    题意 给出一个程序控制流图,从每个结点出发到每个后继接结点的概率均相等.当执行完一个没有后继的结点后,整个程序终止.程序总是从编号为1的结点开始.你的任务是对于若干个查询结点,求出每个结点的期望执行次 ...

随机推荐

  1. 09-看图理解数据结构与算法系列(B树)

    B树 B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树.B_树.是一种自平衡树状数据结构,能对存储的数据进行O(log n)的时间复杂度进行查找.插入和删除.B树一般较多用在存储系统上,比如数 ...

  2. 关于zookeeper中session timeout

    转自https://yq.aliyun.com/articles/117825?t=t1,主要结论如下: 经过源码分析,得出SessionTimeOut的协商如下: 情况1: 配置文件配置了maxSe ...

  3. 【02】emmet系列之HTML语法

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 初始化 :快速编写HTML ...

  4. Python条件判断(if)

    Python条件判断(if) 一.基本介绍 1.Python 编程中 if 语句用于控制程序的执行,基本形式为: if 判断条件: 执行语句…… 需要注意的是,Python没有像其他大多数语言一样使用 ...

  5. BNUOJ 26228 Juggler

    Juggler Time Limit: 3000ms Memory Limit: 32768KB This problem will be judged on HDU. Original ID: 42 ...

  6. [luoguP1086] 花生采摘(模拟)

    传送门 模拟... 代码 #include <cstdio> #include <iostream> #include <algorithm> #define ab ...

  7. [K/3Cloud] 分录行复制和新增行的冲突如何处理

    新增行:执行AfterCreateNewEntryRow,这个函数里面对一些数据进行处理(比如字段给上默认值): 复制行:复制行过程中希望这些字段能够得到我修改行信息后的数据,如果不处理,执行到Aft ...

  8. Toast自定义

    Toast toast=new Toast(MainActivity.this); toast.setView(getLayoutInflater().inflate(R.layout.toast,n ...

  9. hdu - 1627 Krypton Factor (dfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1627 给定 n 和 L 找出第n个范围在0-L之内的字符串,字符串要求没有相邻的子串是相同的. 按照格式输出. ...

  10. Delphi XE4 inline 的用法

    为了提高应用程序的性能,可以用inline声明一个函数过过程,对于声明为inline的过程,编译器在编译时,会取代正常的过程调用方式,取而代之是直接把这个函数的编译代码拿过来生成到调用该过程的地方,有 ...