记录编号 | 425450 | 评测结果 | AAAAAAAAAA | ||
---|---|---|---|---|---|
题目名称 | [HNOI 2013]游走 | 最终得分 | 100 | ||
用户昵称 | 是否通过 | 通过 | |||
代码语言 | C++ | 运行时间 | 0.288 s | ||
提交时间 | 2017-07-15 10:33:25 | 内存使用 | 7.04 MiB | ||
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define eps 1e-8 using namespace std; int n,m,num,x,y,z; int adj[505],in[505],out[505]; double a[505][505],b[505],ans[505],ss[250005]; struct edge{ int s,t,next; }k[250001]; inline int read(){ int sum=0;char ch=getchar(); while(ch<'0'||ch>'9') ch=getchar(); while(ch>='0'&&ch<='9'){sum=sum*10+ch-'0';ch=getchar();} return sum; } int comp(const double&a,const double&b){ return a>b; } void init(int s,int t){ k[num].s=s;k[num].t=t; k[num].next=adj[s];adj[s]=num++; } void Guass(){ int num; for(int i=1;i<n;++i){ num=i; for(int j=i+1;j<=n;++j) if(fabs(a[j][i])>fabs(a[num][i])) num=j; for(int j=1;j<=n;++j) swap(a[i][j],a[num][j]); swap(b[num],b[i]); for(int j=i+1;j<=n;++j){ double t=a[j][i]/a[i][i]; for(int k=1;k<=n;++k) a[j][k]-=a[i][k]*t; b[j]-=b[i]*t; } } for(int i=n;i>=1;--i){ ans[i]=b[i]/a[i][i]; for(int j=i;j>=1;--j){ b[j]-=a[j][i]*ans[i]; } } } double res=0; int main(){ freopen("walk.in","r",stdin); freopen("walk.out","w",stdout); memset(adj,-1,sizeof(adj)); n=read();m=read(); for(int i=1;i<=m;++i){ x=read();y=read(); init(x,y);init(y,x); in[x]++;out[x]++; in[y]++;out[y]++; } out[n]=0; for(int i=adj[n];i!=-1;i=k[i].next){ int o=k[i].t; in[o]--; } for(int i=2;i<=n;++i){ a[i][i]=-1; for(int j=adj[i];j!=-1;j=k[j].next){ int o=k[j].t; if(out[o]) a[i][o]=(double)1/out[o]; } } a[1][1]=-1;b[1]=-1; for(int i=adj[1];i!=-1;i=k[i].next){ int o=k[i].t; if(out[o]) a[1][o]=(double)1/out[o]; } Guass(); for(int i=0;i<num;++i){ int s=k[i].s; if(out[s]) ss[i/2+1]+=ans[s]/out[s]; } sort(ss+1,ss+num+1,comp); //cout<<num<<endl; for(int i=1;i<=num;++i) if(ss[i]) res+=ss[i]*i; else break; printf("%.3lf",res); //while(1); return 0; }