求助!不知道哪错了
查看原帖
求助!不知道哪错了
654281
reclusive楼主2023/10/9 15:11

本地调试的时候显示输出那里爆了。

#include<bits/stdc++.h>
using namespace std;
const int N=510,M=3e5;
const double eps=1e-12;
struct edge{int x,y,pre;}e[M];
int last[N],elen;
void ins(int x,int y){
	e[++elen]=edge{x,y,last[x]};
	last[x]=elen;
}
int n,m,d[N];
double a[N][N],f[N],id[N];
void gauss(){
	int now=1,k;
	for(int i=1;i<=n;i++){
		for(k=now;k<=n;k++){
			if(fabs(a[k][i])>eps){
				swap(a[k],a[now]);
				break;
			}
		}
		if(k==n+1)continue;
		for(k=1;k<=n;k++){
			if(k!=now){
				double tmp=a[k][i]/a[now][i];
				for(int j=1;j<=n+1;j++){
					a[k][j]-=tmp*a[now][j];
				}
			}
		}
		now++;
	}
	for(int i=1;i<=n;i++){
		f[i]=a[i][n+1]/a[i][i];
	}
}
int main(){
	scanf("%d%d",&n,&m);
	elen=1;memset(last,0,sizeof(last));
	for(int i=1;i<=m;i++){
		int x,y;scanf("%d%d",&x,&y);
		ins(x,y),ins(y,x);
		d[x]++,d[y]++;
	}
	n--;a[1][n+1]=-1.0;
	for(int x=1;x<=n;x++){
		a[x][x]=-1.0;
		for(int k=last[x];k;k=e[k].pre){
			int y=e[k].y;
			if(y!=n+1){
				a[x][y]=1.0/d[y];
			}
		}
	}
	gauss();
	for(int k=2;k<=elen;k+=2){
		int x=e[k].x,y=e[k].y;
		id[k/2]=f[x]*1.0/d[x]+f[y]*1.0/d[y];
	}
	sort(id+1,id+m+1);
	double ans=0;
	for(int i=1;i<=m;i++){
		ans=ans+id[i]*1.0*(m-i+1);
	}
	printf("%.3lf",ans);
	return 0;
}
2023/10/9 15:11
加载中...