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

裸高斯消元。。。

但是要判无解和无穷解。

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

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. const int N = ;
  4. const double eps = 1e-;
  5. int n, q;
  6. double a[N][N], d[N];
  7. vector<int> G[N];
  8. int mark[N];
  9. void build()
  10. {
  11. a[][n + ] = -1.0;
  12. for(int i = ; i <= n; ++i)
  13. {
  14. a[i][i] = -1.0;
  15. for(int j = ; j < G[i].size(); ++j)
  16. a[i][G[i][j]] += 1.0 / d[G[i][j]];
  17. }
  18. }
  19. void gauss_jordan()
  20. {
  21. for(int now = ; now <= n; ++now)
  22. {
  23. int x = now;
  24. for(int i = now + ; i <= n; ++i) if(fabs(a[i][now]) > fabs(a[x][now])) x = i;
  25. if(fabs(a[x][now]) < eps) continue;
  26. for(int i = ; i <= n + ; ++i) swap(a[now][i], a[x][i]);
  27. double t = a[now][now];
  28. for(int i = now; i <= n + ; ++i) a[now][i] /= t;
  29. for(int i = ; i <= n; ++i) if(i != now)
  30. {
  31. double t = a[i][now];
  32. for(int j = now; j <= n + ; ++j) a[i][j] -= a[now][j] * t;
  33. }
  34. }
  35. }
  36. int main()
  37. {
  38. int T = ;
  39. while(scanf("%d", &n))
  40. {
  41. ++T;
  42. if(n == ) break;
  43. memset(d, , sizeof(d));
  44. memset(a, , sizeof(a));
  45. memset(mark, , sizeof(mark));
  46. while()
  47. {
  48. int a, b; scanf("%d%d", &a, &b);
  49. if(a == && b == ) break;
  50. G[b].push_back(a);
  51. d[a] += 1.0;
  52. }
  53. build();
  54. gauss_jordan();
  55. for(int i = n; i; --i)
  56. {
  57. if(fabs(a[i][i]) < eps && fabs(a[i][n + ]) > eps)
  58. mark[i] = ;
  59. for(int j = i + ; j <= n; ++j) if(fabs(a[i][j]) > eps && mark[j]) mark[i] = ;
  60. }
  61. scanf("%d", &q);
  62. printf("Case #%d:\n", T);
  63. while(q--)
  64. {
  65. int x; scanf("%d", &x);
  66. if(mark[x]) puts("infinity");
  67. else if(fabs(a[x][x]) < eps) puts("0.000");
  68. else printf("%.3f\n", fabs(a[x][n + ] / a[x][x]));
  69. }
  70. for(int i = ; i <= n; ++i) G[i].clear();
  71. }
  72. return ;
  73. }

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. 杭电 2037 今年暑假不AC

    Problem Description “今年暑假不AC?”“是的.”“那你干什么呢?”“看世界杯呀,笨蛋!”“@#$%^&*%...” 确实如此,世界杯来了,球迷的节日也来了,估计很多ACM ...

  2. python接口测试之序列化与反序列化(四)

    在python中,序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式 字符串解码为python数据对象.在python的标准库中,专门提供了jso ...

  3. HASH的应用(负数下标用偏移量解决)

    Input 每组测试数据有两行,第一行有两个数n,m(0<n,m<1000000),第二行包含n个处于区间[-500000,500000]的整数. Output 对每组测试数据按从大到小的 ...

  4. 转盘抽奖 canvas & 抽奖 H5 源码

    转盘抽奖 canvas https://github.com/givebest/wechat-turntalbe-canvas https://blog.givebest.cn/GB-canvas-t ...

  5. 【SGU194&ZOJ2314】Reactor Cooling(有上下界的网络流)

    题意: 给n个点,及m根pipe,每根pipe用来流躺液体的,单向的,每时每刻每根pipe流进来的物质要等于流出去的物质,要使得m条pipe组成一个循环体,里面流躺物质. 并且满足每根pipe一定的流 ...

  6. Linux下汇编语言学习笔记60 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  7. Nginx 的 server_names_hash_bucket_size 问题

    在 Nginx 0.6.35 的版本中,配置多个 server 虚拟主机,必须要在配置文档中 http { 里头加上 server_names_hash_bucket_size 64; 这么一句 ht ...

  8. [bzoj1578][Usaco2009 Feb]Stock Market 股票市场_完全背包dp

    Stock Market 股票市场 bzoj-1578 Usaco-2009 Feb 题目大意:给定一个$S\times D$的大矩阵$T$,其中$T[i][j]$表示第i支股票第j天的价格.给定初始 ...

  9. VMware配置从U盘启动

    很遗憾,VMware的BIOS不能识别USB启动设备,即使已经把USB设备连接上去. 解决这一问题的做法是直接添加硬盘,硬盘指向物理硬盘,即USB设置. 注意:Ubuntu下要设置这一功能需要使用su ...

  10. 大话设计模式C++实现-第8章-工厂方法模式

    一.UML图 二.概念 工厂方法模式(Factory Method):定义一个用于创建对象的接口,让子类决定实例化哪一个类.工厂方法是一个类的实例化延迟到其子类. 三.包括的角色 (1)抽象工厂 (2 ...