zoukankan      html  css  js  c++  java
  • [BZOJ2337][HNOI2011]XOR和路径

    BZOJ
    Luogu
    今年PKUWC考期望步数所以我什么都不会。。。
    赶紧学一波

    sol

    首先看见异或和,都是套路了。计算出每一位是1的概率直接相加即可。
    (f_i)表示(i)号节点到(n)为1的概率,就有这样的一个转移:

    [f_u=sum_{v,e(u,v)=0}frac{f_v}{du_u}+sum_{v,e(u,v)=1}frac{1-f_v}{du_u} ]

    其中(e(u,v)=0/1)表示这条边的权值在当前枚举的二进制位上是0还是1
    简单地移一下项

    [f_u+sum_{v,e(u,v)=1}frac{f_v}{du_u}-sum_{v,e(u,v)=1}frac{f_v}{du_u}=sum_{v,e(u,v)=1}frac{1}{du_u} ]

    左边都是自变量,右边都是常数。高斯消元走你。
    注意上式中的(uin[1,n)),因为根据定义应有(f_n=0)
    可以直接把最后一个方程设置为只有(f_n)的系数为1,其余都是0。
    复杂度(O(n^3log{w}))

    code

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    using namespace std;
    const int N = 105;
    int gi()
    {
    	int x=0,w=1;char ch=getchar();
    	while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
    	if (ch=='-') w=0,ch=getchar();
    	while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    	return w?x:-x;
    }
    struct edge{int to,next,w;}a[N*N<<1];
    int n,m,head[N],cnt;
    double f[N][N],du[N],sol[N],ans;
    int main()
    {
    	n=gi();m=gi();
    	for (int i=1,u,v,w;i<=m;i++)
    	{
    		u=gi();v=gi();w=gi();
    		a[++cnt]=(edge){v,head[u],w},head[u]=cnt,du[v]+=1;
    		if (u^v) a[++cnt]=(edge){u,head[v],w},head[v]=cnt,du[u]+=1;
    	}
    	for (int zsy=0;zsy<=30;zsy++)
    	{
    		memset(f,0,sizeof(f));
    		for (int u=1;u<n;u++)
    		{
    			f[u][u]=1;
    			for (int e=head[u];e;e=a[e].next)
    			{
    				int v=a[e].to,w=a[e].w&(1<<zsy);
    				if (w) f[u][v]+=1.0/du[u],f[u][n+1]+=1.0/du[u];
    				else f[u][v]-=1.0/du[u];
    			}
    		}
    		f[n][n]=1;//f_n=0
    		for (int i=1;i<=n;i++)
    			for (int j=i+1;j<=n;j++)
    				for (int k=n+1;k>=i;k--)
    					f[j][k]-=f[i][k]*f[j][i]/f[i][i];
    		for (int i=n;i;i--)
    		{
    			sol[i]=f[i][n+1];
    			for (int j=n;j>i;j--) sol[i]-=f[i][j]*sol[j];
    			sol[i]/=f[i][i];
    		}
    		ans+=sol[1]*(1<<zsy);
    	}
    	printf("%.3lf
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    左偏树
    论在Windows下远程连接Ubuntu
    ZOJ 3711 Give Me Your Hand
    SGU 495. Kids and Prizes
    POJ 2151 Check the difficulty of problems
    CodeForces 148D. Bag of mice
    HDU 3631 Shortest Path
    HDU 1869 六度分离
    HDU 2544 最短路
    HDU 3584 Cube
  • 原文地址:https://www.cnblogs.com/zhoushuyu/p/8401174.html
Copyright © 2011-2022 走看看