hdu 4418

来源:互联网 发布:开淘宝店铺挣钱吗 编辑:程序博客网 时间:2024/04/27 18:40
#include<iostream>#include<cstdio>#include<cmath>#include<algorithm>#include<cstring>#include<queue>#define eps 1e-8#define maxn 333using namespace std;int n,m,x,y,d;int cnt;double p[maxn];int vis[maxn];double A[maxn][maxn];int sgn(double num){    if(fabs(num)<eps) return 0;    else return num>0?1:-1;}void init(){    n=(n-1)*2;    memset(A,0,sizeof(A));    if(d==1) x=n-x;}int find_next(int a,int b){    return (a%b+b)%b;}bool bfs(){    memset(vis,-1,sizeof(vis));    cnt=0;    queue<int> q;    q.push(x);    vis[x]=cnt++;    while(!q.empty())    {        int tmp=q.front();        q.pop();        for(int i=1;i<=m;i++)        {            if(sgn(p[i])==0) continue;            int next=find_next(tmp+i,n);            if(vis[next]==-1)            {                vis[next]=cnt++;                q.push(next);            }        }    }    if(vis[y]==-1&&vis[n-y]==-1)    return false;    else    return true;}void build(){    for(int i=0;i<n;i++)    {        A[vis[i]][vis[i]]=1;        if(i==y||i==(n-y))        {            A[vis[i]][cnt]=0;            continue;        }        for(int j=1;j<=m;j++)        {            int next=find_next(i+j,n);            A[vis[i]][vis[next]]-=p[j];            A[vis[i]][cnt]+=j*p[j];        }    }}bool gaosi(){    int i,j,r,c;    for(r=0,c=0;r<cnt&&c<cnt;++c,++r)    {        //找不为0的行        for(i=r;i<cnt;i++)        {            if(sgn(A[i][c])!=0)            break;        }        if(i==cnt)        {            r--;continue;        }        //替换        if(i!=r)        {            for(j=r;j<=cnt;j++) swap(A[i][j],A[r][j]);        }        //消元        for(i=r+1;i<cnt;i++)        {            double f=A[i][c]/A[r][c];            for(j=c;j<=cnt;j++)            {                A[i][j]-=A[r][j]*f;            }        }    }    //判断是否有解    for(i=r;i<cnt;i++)    {        if(sgn(A[i][cnt])) return -1;//无解    }    if(r<cnt) return cnt-r;//有无穷解    //回代    for(i=cnt-1;i>=0;i--)    {        for(j=cnt-1;j>i;j--)        {            A[i][cnt]-=A[i][j]*A[j][cnt];        }        A[i][cnt]/=A[i][i];        A[i][i]=1;    }    return 0;}int main(){    int t;    scanf("%d",&t);    while(t--)    {        scanf("%d%d%d%d%d",&n,&m,&y,&x,&d);        for(int i=1; i<=m; i++)        {            scanf("%lf",&p[i]);            p[i]/=100;        }        if(x==y)        {            printf("0.00\n");            continue;        }        init();        if(!bfs())        {            printf("Impossible !\n");            continue;        }        build();        if(gaosi()==0)        {            printf("%.2lf\n",A[vis[x]][cnt]);        }        else        {            printf("Impossible !\n");        }    }    return 0;}

原创粉丝点击