记录编号 425450 评测结果 AAAAAAAAAA
题目名称 [HNOI 2013]游走 最终得分 100
用户昵称 GravatarHzoi_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;
}