【日记】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……)表示取出第一列,这样说的话这就算是一个线性的方程组了,可以利用高斯消元法求解。
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比我们普及多了。