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. ecshop 修改支持php7 方案

    修改方法 http://jsb.php-php.com/2016/05/472/ 修改数据库配置 data/config.php

  2. 安装bitcore

    官网----------------------------------------------https://bitcore.io先安装好 node.js v4,  npmsudo npm inst ...

  3. LeetCode(38) Count and Say

    题目 The count-and-say sequence is the sequence of integers beginning as follows: 1, 11, 21, 1211, 111 ...

  4. 集训第五周动态规划 D题 LCS

    Description In a few months the European Currency Union will become a reality. However, to join the ...

  5. 初入lambda表达式 (主要是c++11)

    写一篇不猫的博文吧 定义 lambda表达式的定义如下 [capture](parameters) mutable ->return-type{statement} 翻译成人话就是 1.[cap ...

  6. matplotlib的使用--折线图--入门

    目录 matplotlib应用介绍 一天天气变化图 两小时随机温度图 中文显示问题 个人交往统计图 多人交往统计图 总结 介绍: 举个例子(一天天气变化图): 假设一天中每隔两个小时(range(2, ...

  7. js给对象添加属性

    obj.prototype = shuxing: shuxing['属性']=值: function Person(){}; var person = new Person(); person.nam ...

  8. Leetcode 213.大家劫舍II

    打家劫舍II 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两 ...

  9. onos控制器通过REST API下发流表

    onos控制器REST API地址:http://192.168.43.14:8181/onos/v1/docs/ stream书写格式: { "id": "675540 ...

  10. MongoDB小结11 - update【save】

    save是一个shell函数,调用它,可以在文档不存在时插入,存在时更新,它只有一个参数:文档.如果文档有 _id 这个 键,那么save会调用upsert,否则会调用insert,非常方便.