记录编号 |
411595 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 2013]游走 |
最终得分 |
100 |
用户昵称 |
LadyLex |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.493 s |
提交时间 |
2017-06-05 20:56:18 |
内存使用 |
7.24 MiB |
显示代码纯文本
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=510;
int n,m,du[N];
long double f[N][N];
double x[N*N],w[N],ans;
struct node{int qi,zhong;}s[N*N];
inline void gasse(){
for(int i=1;i<n;i++){
int maxn=i;
for(int j=i+1;j<n;j++)
if(fabs(f[maxn][i])<fabs(f[j][i]))
maxn=j;
if(maxn!=i)
for(int j=1;j<=n;j++)
swap(f[i][j],f[maxn][j]);
long double tmp=f[i][i];
for(int j=1;j<=n;j++)f[i][j]/=tmp;
for(int j=1;j<n;j++)
if(i!=j){
tmp=f[j][i];
for(int k=1;k<=n;k++)
f[j][k]-=tmp*f[i][k];
}
}
for(int i=1;i<n;i++)
w[i]=f[i][n];
}
int main()
{
freopen("walk.in","r",stdin);
freopen("walk.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
scanf("%d%d",&s[i].qi,&s[i].zhong);
du[s[i].qi]+=1,du[s[i].zhong]+=1;
}f[1][n]=1.0;
for(int i=1;i<n;i++)f[i][i]=1;
for(int i=1;i<=m;i++){
if(s[i].qi==n||s[i].zhong==n)continue;
f[s[i].qi][s[i].zhong]+=-1.0/du[s[i].zhong];
f[s[i].zhong][s[i].qi]+=-1.0/du[s[i].qi];
}
gasse();
for(int i=1;i<=m;i++){
x[i]+=w[s[i].qi]/du[s[i].qi];
x[i]+=w[s[i].zhong]/du[s[i].zhong];
}
ans=0;
sort(x+1,x+m+1);
//for(int i=1;i<=m;i++)printf("%lf ",x[i]*(m-i+1));
for(int i=1;i<=m;i++)ans+=x[i]*(m-i+1);
printf("%.3lf",ans);
}