【日记】6.13

  上午看了看周伟写的《状态压缩》感觉收获还可以,准备明天上午写写题。

  下午考试完全是虐的,3道题题目描述一个比一个长。

这里是最后的结果

干净利落……

 

第一道题,我隐约觉得是dp,但是没有思路就没去写。

第二题是矩阵乘法的思路+高斯消元法,因为上午刚在论文里看到了一段话:

   “给出一个图的0/1邻接矩阵G( 允许有自环,两点间允许有多条路径,此时G(i,j)表示i 到j 的边的条数),则从某点i走k步到某点j的路径数G^k(i,j)”

  不得不说我的运气很好,于是我想到了如果表示的不是边数而是概率的话,那么G^k(i,j)表示的就应该是本题中的K时间后到达j点的概率,那么第一列放的就是从1出发到每个点的概率,要求的总概率就应该是每个时刻到j点的概率了(包括第1,2,3,4……),这些概率中唯一的区别就是矩阵连乘的次数了,那么可以认为是一个无限递降等比数列,利用求和公式,知道最后有tot=p/q*(1-M)^(-1)*B 其中M就是这个邻接矩阵,B是(1,0,0,0……)表示取出第一列,这样说的话这就算是一个线性的方程组了,可以利用高斯消元法求解。

dotp
 1 /**
 2 *Prob    : dotp
 3 *Data    : 2012-6-13
 4 *Sol    : 高斯消元
 5 *Author : ZhouHang
 6 */
 7 
 8 #include <cstdio>
 9 #include <cstring>
10 #include <iomanip>
11 #include <algorithm>
12 
13 #define MaxN 310
14 
15 using namespace std;
16 
17 int n,i,j,e,y,p,q;
18 int d[MaxN];
19 bool map[MaxN][MaxN];
20 double m[MaxN][MaxN],x[MaxN],b[MaxN];
21 
22 void doit()
23 {
24     for (int k=1; k<n; k++)
25      for (int i=k+1; i<=n; i++)
26      {
27         double t=m[i][k]/m[k][k];
28         for (int j=k+1; j<=n; j++)
29             m[i][j]-=m[k][j]*t;
30         b[i]-=b[k]*t;
31      }
32      
33     for (int i=n; i>=1; i--)
34     {
35         double sum=0;
36         for (j=n; j>i; j--)
37             sum+=m[i][j]*x[j];
38         x[i]=(b[i]-sum)/m[i][i];
39     }
40 }
41 
42 int main()
43 {
44     freopen("dotp.in","r",stdin);
45     freopen("dotp.out","w",stdout);
46     
47 
48     scanf("%d%d%d%d",&n,&e,&p,&q);
49     double tmp=(double)p/q;
50     
51     int u,v;
52     memset(map,false,sizeof(map));
53     for (int i=1; i<=e; i++)
54     {
55         scanf("%d%d",&u,&v);
56         d[u]++; d[v]++;
57         map[u][v]=true; map[v][u]=true;
58     }
59     
60     b[1]=tmp;
61     for (int i=1; i<=n; i++)
62     {
63         m[i][i]=1;
64         for (int j=1; j<=n; j++)
65             if (map[i][j]) m[i][j]=-(1-tmp)/d[j];
66     }
67     
68     doit();
69     
70     for (int i=1; i<=n; i++)
71         printf("%.9lf\n",x[i]);
72     
73     fclose(stdin); fclose(stdout);
74     return 0;
75 }

 

第三题,如果不输出方案的话50%很好拿,但是据他们说评测的OJ是没有插件的,也就是说没有只看答案,不管方案的那个分,于是我果断放弃了,到现在还没有讲评,我就先说下自己的做法吧[未知对错,日后修改……]

  个人感觉是个网络流,把每个点成两个,中间一条边流量为1表示只允许存在一头牛,每个J点拆成3个,一个连源点,如果一个点能到另一个就再连一条边,每个T点连到汇点上,这样求个最大流就行了,【不要问我怎么解决离开后可以占据,插图太麻烦,但是把J拆成3个可以解决这个问题的,具体可以自己琢磨】但是方案不太好查,也没有去想。

 

  总体感觉我选择第二题是对的、但是真的考试的话我会先去写第三题的50%,因为果的最大流并不难写,至于第二题完全是算运气了,看到了至关重要的一句话……不得不说很奇妙。

 

P.S 我错了,我忏悔,向老师认错,向ZSJ认错、昨天晚自习的时候跟着各位大神浮躁了一个小时……算是释放下压力了、不得不说,省实验dota比我们普及多了。

posted @ 2012-06-14 09:31  守護N1身边  阅读(142)  评论(0编辑  收藏  举报