hdu 5001 矩阵 快速幂

来源:互联网 发布:计算机编程基础知识 编辑:程序博客网 时间:2024/05/16 18:58

题目大意:给n个点,m条边,每个点选择每条边都是任意的,求走K步,不经过每一个点的概率。

这里用了一个struct代表一种类型(矩阵类型),这样写比较方便,以后可以这样用!!!

一开始我题目理解错了,写错了也就算了,可是当题目理解对了之后,还是错,真的是。。。虽然我知道我的代码能力差,但是总是犯一些很傻比的错误,我真的很忧伤,所以呢,以后写题要更加小心才可以,也要完完全全想清楚才行!!!!点击打开链接

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int node[60], n, m, step;bool flag[60][60];struct matrix{    double a[60][60];};matrix rela, ans, temp;matrix mut(matrix A, matrix B){    int i, j;    matrix res;    for(i = 1; i <= n; i++)    {        for(j = 1; j <= n; j++)        {            res.a[i][j] = 0;            for(int t = 1; t <= n; t++)                res.a[i][j] += A.a[i][t] * B.a[t][j];        }    }    return res;}void solve( int step ){    int i, j;    for(i = 1; i <= n; i++)        for(j = 1; j <= n; j++)            ans.a[i][j] = (i == j);    while(step)    {        if(step & 1)           ans = mut(ans, rela);        rela = mut(rela, rela);        step /= 2;    }}int main(){    int T, cas, i, j;    int pp, qq;    scanf("%d", &T);    for(cas = 1; cas <= T; cas++)    {        scanf("%d%d%d", &n, &m, &step);        memset(node, 0, sizeof(node));        memset(flag, 0, sizeof(flag));        for(i = 1; i <= m; i++)        {            scanf("%d%d", &pp, &qq);            node[pp]++;   node[qq]++;            flag[pp][qq] = flag[qq][pp] = 1;        }        for(i = 1; i <= n; i++)        {            for(j = 1; j <= n; j++)            {                rela.a[j][j] = 0;                for(int t = 1; t <= n; t++)                {                    if(t!=j)                    {                        if(j==i || t==i)                            rela.a[j][t] = 0;                        else if(flag[j][t])                            rela.a[j][t] = 1.0/node[j];                        else                            rela.a[j][t] = 0;                    }                }            }            //一开始写得是solve(),所以导致step在第一次计算后就变了,所以后面的只不对、            solve( step );            double mm;            double sum = 0;            for ( int j = 1 ; j <= n ; j ++ ) {                for ( int k = 1 ; k <= n; k ++)                    sum += ans.a[j][k] ;            }            printf("%.8lf\n", sum/n);        }    }    return 0;}

0 0
原创粉丝点击