求助各路神仙,调了很久,可还是只有20分
查看原帖
求助各路神仙,调了很久,可还是只有20分
272314
Autonomier楼主2020/8/12 18:04
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=2e5+10;
inline int read()
{
	int s=0,w=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
    return s*w;
}
int n,m;
struct Edge
{
	int to,fr,nt;
}e[maxn*2];
int head[maxn],cnt;
inline void update(int x,int y)
{
	e[++cnt].nt=head[x];
	e[cnt].fr=x;
	e[cnt].to=y;
	head[x]=cnt;
}
int deg[maxn];
double eq[510][510];
inline void Gauss()
{
	for(int i=1;i<n;i++)
	{
		int index=i;
		for(int j=i;j<n;j++)
		{
			if(fabs(eq[j][i]>fabs(eq[index][i])))
				index=j;
		}
		for(int j=1;j<=n;j++)
		{
			swap(eq[index][j],eq[i][j]);
		}
		for(int j=1;j<n;j++)
		{
			if(j==i)
				continue;
			double temp=eq[j][i]/eq[i][i];
			for(int k=i+1;k<=n;k++)
			{
				eq[j][k]-=eq[i][k]*temp;
			}
		}
	}
}
double Ex[maxn];
double Ex_edge[maxn*2];
int main()
{
	n=read(),m=read();
	for(int i=1;i<=m;i++)
	{
		int x,y;
		x=read(),y=read();
		update(x,y);
		update(y,x);
		deg[x]++;
		deg[y]++; 
	}
	for(int x=1;x<n;x++)
	{
		for(int i=head[x];i;i=e[i].nt)
		{
			int y=e[i].to;
			if(y==n)
				continue;
			eq[x][y]=(1.00/(deg[x]*1.00));
		}
		eq[x][x]=-1.00;
	}
	eq[1][n]=-1.00;
	Gauss();
	for(int i=1;i<n;i++)
	{
		Ex[i]=eq[i][n]/eq[i][i];
	}
	int num=1;
	for(int i=1;i<=m;i++)
	{
		Ex_edge[i]=Ex[e[num].fr]/(1.00*deg[e[num].fr])+Ex[e[num].to]/(1.00*deg[e[num].to]);
		num+=2;
	}
	sort(Ex_edge+1,Ex_edge+1+m);
	double res=0.00;
	for(int i=1;i<=m;i++)
	{
		int trans=m-i+1;
		res+=Ex_edge[i]*(1.00*trans);
	}
	printf("%.3lf\n",res);
 	return 0;
}

2020/8/12 18:04
加载中...