求助,刚学OI
查看原帖
求助,刚学OI
227824
JK_LOVER楼主2020/5/18 09:09
#include<bits/stdc++.h>
using namespace std;
int read(){
	int x=0,f=1;char ch=getchar();
	while(!isdigit(ch)){
		if(ch=='-')f=0;ch=getchar();
	}
	while(isdigit(ch)){
		x=x*10+ch-'0';ch=getchar();
	}
	return f?x:-x;
}
const int N = 5100;
vector<int> G[N];

double a[N][N],f[N],x[N];
void Gauss(int n){
	for(int i = 1;i <= n;i++)
	{
		int maxn = i;
		for(int j = i+1;j <= n;j++)
		{
			if(fabs(a[maxn][i]) < fabs(a[j][i]))
			maxn = j;
		}
		if(maxn != i){
			for(int j = 1;j <= n+1;j++)
			swap(a[maxn][j],a[i][j]);
		}
		for(int j = 1;j <= n;j++)
		{
			if(j==i) continue;
			double temp = a[j][i]/a[i][i];
			for(int k = 1+i;k <= n+1;k++)
			{
				a[j][k] -= temp*a[i][k];
		//		cout<<a[j][k]<<" ";
			}
		//	cout<<endl;
		}
	}
	for(int i = 1;i <= n;i++)
//	cout<<a[i][i]<<" ",
	x[i] = a[i][n+1]/a[i][i];
}
int n,m,st[N],ed[N],d[N];
int main(){
	n=read();m=read();
	for(int i = 1;i <= m;i++){
		st[i] = read();
		ed[i] = read();
		G[ed[i]].push_back(st[i]);
		G[st[i]].push_back(ed[i]);
		++d[st[i]];++d[ed[i]];
	}
	for(int i = 1;i < n;i++)
	{
		a[i][i] = 1.0;
		for(int j = 0;j < G[i].size();j++)
		{
			int v = G[i][j];
			if(v!=n)
			a[i][v] = -1.0/d[v];
		}
	}
	a[1][n] = 1.0;
	Gauss(n-1);
	for(int i = 1;i <= m;i++){
		int a=st[i],b=ed[i];
		if(a!=n) f[i]+=x[a]/d[a];
		if(b!=n) f[i]+=x[b]/d[b];
	}
	sort(f+1,f+1+m);
	double ans=0;
	for(int i = 1;i <= m;i++)
	ans+=(m-i+1)*f[i];
	printf("%.3lf\n",ans);
	return 0;
}

WA了一半

2020/5/18 09:09
加载中...