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;}