[HNOI2011] XOR和路径

  • 注意出现自环时只需要连一条边
#include <bits/stdc++.h>
using namespace std;
int n,m;
typedef pair<int,int> pii;
vector<pii>a[105];
double f[105],ans;
double c[305][305];
void Gauss(int m,int n)
{
	int p=0;
	for(int i=1;i<=n&&p<m;i++)
	{
		for(int j=p+1;j<=m;j++)
		{
			if(fabs(c[j][i])>1e-8)
			{
				swap(c[p+1],c[j]);
				break;
			}
		}
		if(fabs(c[p+1][i])<1e-8)
		{
			continue;
		}
		p++;
		for(int j=1;j<=m;j++)
		{
			if(p!=j)
			{
				double rate=c[j][i]/c[p][i];
				for(int k=1;k<=n+1;k++)
				{
					c[j][k]-=c[p][k]*rate;
				}
			}
		}
	}
	for(int i=1;i<=n;i++)
	{
		f[i]=c[i][n+1]/c[i][i];
	}
}
void solve(int j)
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n+1;j++)
		{
			c[i][j]=0;
		}
	}
	for(int i=1;i<n;i++)
	{
		double rate=1.0/a[i].size();
		for(pii k:a[i])
		{
			int v=k.first;
			int w=(k.second>>j)&1;
			if(w==0)
			{
				c[i][v]-=rate;
			}
			else
			{
				c[i][v]+=rate;
				c[i][n+1]+=rate;
			}
		}
		c[i][i]++;
	}
	c[n][n]=1;
	Gauss(n,n);
	ans=ans+f[1]*(1<<j);
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n>>m;
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		cin>>u>>v>>w;
		a[u].push_back(pii(v,w));
		if(u!=v)
		{
			a[v].push_back(pii(u,w));
		}
	}
	for(int j=0;j<30;j++)
	{
		solve(j);
	}
	cout<<fixed<<setprecision(3)<<ans<<endl;
	return 0;
}
posted @ 2025-02-19 21:54  D06  阅读(9)  评论(0)    收藏  举报
//雪花飘落效果