uva10828
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的更多相关文章
- UVA-10828 (概率期望+高斯消元)
题意: 给个有向图,每个节点等概率转移到它的后继节点,现在问一些节点的期望访问次数; 思路: 对于一个点v,Ev=Ea/d[a]+Eb/d[b]+Ec/d[c];a,b,c是v的前驱节点; 然后按这个 ...
- UVa10828 Back to Kernighan-Ritchie——概率转移&&高斯消元法
题意 给出一个程序控制流图,从每个结点出发到每个后继接结点的概率均相等.当执行完一个没有后继的结点后,整个程序终止.程序总是从编号为1的结点开始.你的任务是对于若干个查询结点,求出每个结点的期望执行次 ...
随机推荐
- Oracle创建 表空间 用户 给用户授权命令
//创建表空间 create tablespace ACHARTSdatafile 'D:\oradata\orcl\ACHARTS01.DBF' size 800mautoextend on nex ...
- STM32F407 跑马灯 库函数版 个人笔记
原理图: MCU在开发板原理图的第二页,LED在开发板原理图的第三页 由图可知,PF9 ,PF10 若输出低电平则灯亮,高电平则灯灭 选推挽输出 代码步骤 使能IO口时钟. 调用函数RCC_AHB1P ...
- Codeforces Round #372 (Div. 2) A .Crazy Computer/B. Complete the Word
Codeforces Round #372 (Div. 2) 不知不觉自己怎么变的这么水了,几百年前做A.B的水平,现在依旧停留在A.B水平.甚至B题还不会做.难道是带着一种功利性的态度患得患失?总共 ...
- [K/3Cloud] 分录行复制和新增行的冲突如何处理
新增行:执行AfterCreateNewEntryRow,这个函数里面对一些数据进行处理(比如字段给上默认值): 复制行:复制行过程中希望这些字段能够得到我修改行信息后的数据,如果不处理,执行到Aft ...
- [NOIP2007] 提高组 洛谷P1099 树网的核
题目描述 设T=(V, E, W) 是一个无圈且连通的无向图(也称为无根树),每条边到有正整数的权,我们称T为树网(treebetwork),其中V,E分别表示结点与边的集合,W表示各边长度的集合,并 ...
- 【HDOJ6118】度度熊的交易计划(费用流)
题意: 度度熊参与了喵哈哈村的商业大会,但是这次商业大会遇到了一个难题: 喵哈哈村以及周围的村庄可以看做是一共由n个片区,m条公路组成的地区. 由于生产能力的区别,第i个片区能够花费a[i]元生产1个 ...
- AtCoder Grand Contest 020 D - Min Max Repetition
q<=1000个询问,每次问a,b,c,d:f(a,b)表示含a个A,b个B的字符串中,连续A或连续B最小的串中,字典序最小的一个串,输出这个串的c到d位.a,b<=5e8,d-c+1&l ...
- SOJ 2818_QQ音速
[题意]两只手,一次只能用一只手按一个键子(0,1,2,3),给出从i键到j键所需的消耗的体力,求依次按下一系列键子所需最小体力. [分析] 法一:开一个三维数组,分别记录移动到位置及左右手按的键子. ...
- nodejs window下安装与配置淘宝镜像
1,前往nodejs官网下载安装软件,地址:https://nodejs.org/en/ 2,点击下一步继续安装,安装完成,在命令输入:node -v,npm -v,查看版本,即是安装成功 3,随便在 ...
- 洛谷 P1065 作业调度方案
P1065 作业调度方案 题目描述 我们现在要利用 mm 台机器加工 nn 个工件,每个工件都有 mm 道工序,每道工序都在不同的指定的机器上完成.每个工件的每道工序都有指定的加工时间. 每个工件的每 ...