抱零,但看不出代码问题,求HACK(知道大佬没心思帮我调)
查看原帖
抱零,但看不出代码问题,求HACK(知道大佬没心思帮我调)
180924
FLAT_LCH楼主2022/4/29 15:12
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>

using namespace std;

struct bian
{
	int v,w,nex;
}s[30000];
struct node
{
	int head,fa;
	double l;
}p[110];

int n,m,len=1,now;
double res[110]={},mx=1;
double a[110][110],b[110];
const double eps=1e-9;

inline int rd()
{
	int s=0;char x='x';
	while(x<'0'||x>'9')x=getchar();
	while(x>='0'&&x<='9'){s=s*10+(x^48);x=getchar();}
	return s;
}

inline void lian(int u,int v,int w)
{
	p[u].l+=1;
	len++;s[len].v=v;s[len].w=w;s[len].nex=p[u].head;p[u].head=len;
	if(u==v)return;
	p[v].l+=1;
	len++;s[len].v=u;s[len].w=w;s[len].nex=p[v].head;p[v].head=len;
}

inline void readd()
{
	n=rd();m=rd();
	for(int i=1,u,v,w;i<=m;i++)
	{
		u=rd();v=rd();w=rd();
		if(mx<=w)mx=w;
		lian(u,v,w);
	}
}

void dfs(int u)
{
	if(u==n)return;
	//cout<<u<<' '<<p[u].l<<endl;
	len++;a[len][u]+=p[u].l;
	int v,w;
	for(int i=p[u].head;i;i=s[i].nex)
	{
		v=s[i].v;w=s[i].w;
		//if(v==n)continue;
		a[len][v]+=(((w>>now)&1)?1.00:-1.00);
		b[len]+=((w>>now)&1)*1.0;
		/*if((w>>now)&1)
			a[len][v]=1;
		else 
			a[len][v]=-1;*/
	}
	
	for(int i=p[u].head;i;i=s[i].nex)
	{
		v=s[i].v;
		if(p[v].fa==u)
			dfs(v);
	}
}

inline int cmp(double x){return fabs(x)<eps?0:x<0?-1:1;}

inline void gsxy()
{
	/*
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
			cout<<a[i][j]<<' ';
		cout<<","<<b[i]<<endl;
	}
	cout<<endl;
	*/
	for(int i=1;i<n;i++)
	{
		for(int j=i+1;j<=n;j++)
		{
			for(int k=i+1;k<=n;k++)
				if(cmp(a[j][i]))
					a[j][k]-=a[i][k]*a[j][i]/a[i][i];
			if(cmp(a[j][i]))b[j]-=b[i]*a[j][i]/a[i][i];
			if(cmp(a[j][i]))a[j][i]-=a[i][i]*a[j][i]/a[i][i];
		}
	}
	
	for(int i=n;i>=1;i--)
	{
		b[i]/=a[i][i];
		a[i][i]=1;
		for(int j=i-1;j>=1;j--)
		{
			b[j]-=a[j][i]*b[i];
			a[j][i]=0;
		}
	}
}

inline void working()
{
	double xxx=1;
	for(now=0;now<=32&&xxx<=mx;now++,xxx*=2)
	{
		len=0;
		memset(a,0,sizeof(a));memset(b,0,sizeof(b));
		dfs(1);
		a[n][n]=1;b[n]=0;
		gsxy();
		res[now]=b[1];
		//cout<<b[1]<<' '<<(b[1]>(1e-9))<<' '<<(b[1]<(1e-9))<<endl<<endl<<endl<<endl;
	}
}

void build(int u)
{
	int v;
	for(int i=p[u].head;i;i=s[i].nex)
	{
		v=s[i].v;
		if(p[v].fa==0)
		{
			p[v].fa=u;
			build(v);
		}
	}
}

inline void print()
{
	double ans=0;
	int x=1;
	for(int i=0;i<=32&&x<=mx;i++,x*=2)
	{
		ans+=x*res[i];
		//cout<<ans<<endl;
	}
	printf("%.3lf",abs(ans));
}

int main()
{
	//node1 a;n=11;a.id=33;a.a=3;//a.x=1;	
	//cout<<ret(tos(a)).id<<' '<<ret(tos(a)).a<<' ';
	
	readd();
	p[1].fa=-1;build(1);
	working();
	print();
	
	return 0;
}
/*
3
1 2 3 1
1 3 2 1
2 3 1 1

-0.667+1.667-
*/
2022/4/29 15:12
加载中...