记录编号 |
425450 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[HNOI 2013]游走 |
最终得分 |
100 |
用户昵称 |
Hzoi_Maple |
是否通过 |
通过 |
代码语言 |
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;
}