BZOJ2337: [HNOI2011]XOR和路径(高斯消元,期望)

解题思路:

Xor的期望???怕你不是在逗我。

按为期望,新技能get

剩下的就是游走了。

代码:

 1 #include<cmath>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 struct pnt{
 6     int hd;
 7     int ind;
 8 }p[101];
 9 struct ent{
10     int twd;
11     int lst;
12     int vls;
13 }e[30001];
14 double a[201][201];
15 int cnt;
16 int n,m;
17 void ade(int f,int t,int v)
18 {
19     cnt++;
20     e[cnt].vls=v;
21     e[cnt].twd=t;
22     e[cnt].lst=p[f].hd;
23     p[f].hd=cnt;
24     p[f].ind++;
25     return ;
26 }
27 void G_(void)
28 {
29     for(int i=1;i<=n;i++)
30     {
31         int h=i;
32         for(int j=i+1;j<=n;j++)if(fabs(a[h][i])<fabs(a[j][i]))h=j;
33         if(h!=i)for(int j=i;j<=n+1;j++)std::swap(a[i][j],a[h][j]);
34         for(int j=i+1;j<=n;j++)
35         {
36             double s=a[j][i]/a[i][i];
37             for(int k=i;k<=n+1;k++)a[j][k]-=a[i][k]*s;
38         }
39     }
40     for(int i=n;i>1;i--)
41     {
42         for(int j=i-1;j>0;j--)
43         {
44             a[j][n+1]-=a[i][n+1]/a[i][i]*a[j][i];
45         }
46     }
47     return ;
48 }
49 int main()
50 {
51 //    freopen("a.in","r",stdin);
52     scanf("%d%d",&n,&m);
53     for(int i=1;i<=m;i++)
54     {
55         int a,b,c;
56         scanf("%d%d%d",&a,&b,&c);
57         ade(a,b,c);if(a!=b)ade(b,a,c);
58     }
59     double ans=0;
60     for(int i_=0;(1ll<<i_)<=(long long)(1e9);i_++)
61     {
62         memset(a,0,sizeof(a));
63         for(int i=1;i<=n;i++)
64         {
65             a[i][i]=p[i].ind;if(i==n)continue;
66             for(int i__=p[i].hd;i__;i__=e[i__].lst)
67             {
68                 int j=e[i__].twd;
69                 if(e[i__].vls&(1<<i_))a[i][j]+=1.00,a[i][n+1]+=1.00;
70                 else                  a[i][j]-=1.00;
71             }
72         }
73         G_();double ps=a[1][n+1]/a[1][1];
74         ans+=ps*(1ll<<i_);
75     }
76     printf("%.3lf\n",ans);
77     return 0;
78 }

 

posted @ 2019-01-22 22:24  Unstoppable728  阅读(195)  评论(0编辑  收藏  举报