uva-10828 期望dp+gauss

传送门

题意:给你一个有向图,从1号节点出发,问经过某个点的期望次数。

思路:传递闭包写错wa到哭。设 dp[i]为经过i点期望

dp[v]=dp[u1]*p1+dp[u2]*p2+....(对于第一个点应该再+1)

将每个dp看做变量,就可以构成n*n的矩阵比如样例1构成矩阵如下

-1    1  0    -1

0.5   -1   0   0

 0    0.5  -1  0

用高斯消元解就可以,对于有解得dp直接输出就可以,对于无穷的,与他相关的点也无穷,也就是他传递闭包能到的点。

代码一:

#include
using namespace std;
#define eps 1e-9
const int MAXN=110;
double a[MAXN][MAXN], x[MAXN];
int equ, var;
int n;

int gauss(){
    int i, j, k, col, max_r;
    for(k=0, col=0; kfabs(a[max_r][col]))
                max_r=i;

        if(fabs(a[max_r][col]) G[110];
int dgr[110];
bitset<110> inf;
int mp[110][110];

int main(){
    int cas=0;

    while(~scanf("%d", &n) && n){
        memset(a, 0, sizeof a);
        memset(x, 0, sizeof x);
        memset(mp, 0, sizeof mp);
        inf.reset();

        for(int i=0; ieps && fabs(a[i][i])

代码二:

#include
using namespace std;
#define eps 1e-9
const int MAXN=110;
double a[MAXN][MAXN], x[MAXN];
int equ, var;
int n;

int gauss(){
    int i, j, k, col, max_r;
    for(k=0, col=0; kfabs(a[max_r][col]))
                max_r=i;

        if(fabs(a[max_r][col]) G[110];
int dgr[110];
bitset<110> inf;

int main(){
    int cas=0;
    //freopen("E:/in.txt", "r", stdin);
    //freopen("E:/example.txt", "w", stdout);
    while(~scanf("%d", &n) && n){
        memset(a, 0, sizeof a);
        memset(x, 0, sizeof x);
        inf.reset();

        for(int i=0; i=0; i--){
            if(fabs(x[i])>eps && fabs(a[i][i])eps && inf[j]) inf[i]=1;
        }

        printf("Case #%d:\n", ++cas);
        int Q, p;
        scanf("%d", &Q);
        while(Q--){
            scanf("%d", &p);
            p--;
            if(inf[p])
                puts("infinity");
            else{
                printf("%.3lf\n", fabs(x[p]));
            }
        }

    }

    return 0;
}
/*
3
1 3
3 2
0 0
3
1
2
3

5
1 2
3 5
2 4
3 1
4 2
2 3
4 5
0 0
5
1
2
3
4
5


*/

 

你可能感兴趣的:(#,dp,ACM)