2012年8月7日

[简单DP] COJ 1123 PK武林盟主

摘要: 状态转移方程p[i,j] = 0.5*(p[i-1,j]+p[i,j-1])。浮点数运算,初始时要向上取整。# include <stdio.h># include <math.h># include <string.h>int ap1, ap2, hp1, hp2;double f[1005][1005];double cal(int x, int y){ if (f[x][y] >= 0) return f[x][y]; if (x <= 0) return f[x][y] = 0; if (y <= 0) return f[x][y] 阅读全文

posted @ 2012-08-07 16:08 getgoing 阅读(263) 评论(0) 推荐(0) 编辑

[无向图割点] PKU 1523 SPF

摘要: targan算法。 1 # include <cstdio> 2 # include <cstring> 3 4 # define N (1000 + 5) 5 6 int n, son, tmpdfn; 7 int low[N], dfn[N], subnets[N]; 8 char g[N][N]; 9 10 int Min(int x, int y)11 {12 return x<y ? x:y;13 }14 15 void tarjan(int u, int r)16 {17 dfn[u] = low[u] = ++tmpdfn;18 for (int v 阅读全文

posted @ 2012-08-07 14:57 getgoing 阅读(195) 评论(0) 推荐(0) 编辑

[强联通分量_tarjan] PKU 1236 Network of Schools

摘要: 和每日一题一样,只不过是给出每个顶点的邻接点,这里使用邻接表来做。 1 # include <cstdio> 2 # include <cstring> 3 4 # define N (100 + 5) 5 # define M ((N) * (N)) 6 7 int n, m; 8 int top, cols, tmpdfn; 9 int c[N], in[N], out[N], low[N], dfn[N], first[N], s[N]; 10 int u[M], v[M], next[M]; 11 char ins[N]; 12 13 int Min(int x 阅读全文

posted @ 2012-08-07 13:12 getgoing 阅读(184) 评论(0) 推荐(0) 编辑

[MST_prim] PKU 1258 Agri-Net

摘要: prim入门练习题。prim的流程如下:// 清空顶点集;任选一个点u作为起点,加入顶点集,从u出发选一条最小边(u, v),将v加入顶点集,重复直到所有点都进入顶点集。其中最小边可以用堆来做,还可以用邻接表加速(这里嫌麻烦)。 1 # include <cstdio> 2 # include <queue> 3 4 using namespace std; 5 6 typedef pair<int, int> pii; 7 8 # define N (100 + 5) 9 # define INF 0x7FFFFFFF10 11 int n;12 int 阅读全文

posted @ 2012-08-07 11:30 getgoing 阅读(221) 评论(0) 推荐(0) 编辑

[强联通分量_tarjan] 0725

摘要: tarjan算法的思路不难理解,用low来标记同一个强联通分量中的点,初始时low[i]=dfn[i],当访问到已经在当前栈中的顶点时,相当于找到了一个强联通分量的根节点(一个强联通分量中最早访问到的作为根节点),然后递归地更新栈中所有节点,如果遇到low[k]=dfn[k],说明k就是这个分量的根,于是对之前的所有点出栈并标记(此处标记用连续的值1,2,3代表第几个强联通分量,其实可以直接用low就行,cols记录强联通分量的个数)。 1 # include <cstdio> 2 # include <cstring> 3 4 # define N (100 + 5) 阅读全文

posted @ 2012-08-07 10:26 getgoing 阅读(214) 评论(0) 推荐(0) 编辑

[线段相交] 0807

摘要: 模版,注意使用int可能在求叉乘的过程中溢出,解决办法:使用double(使用int在在返回时只返回符号有时也可以);使用double的:# include <cmath>const double eps = 1e-8;struct Point{double x, y;} ;int dcmp(double x){ if (fabs(x) < eps) return 0; return x>0 ? 1:-1;}int direction(Point p1, Point p2, Point p3){ double tmp = (p3.x-p1.x)*(p2.y-p1.y) 阅读全文

posted @ 2012-08-07 09:26 getgoing 阅读(163) 评论(0) 推荐(0) 编辑

[强联通分量_DFS] 0725

摘要: N个学校之间有单向的网络,每个学校得到一套软件后,可以通过单向网络向周边的学校传输。问题1:初始至少需要向多少个学校发放软件,使得网络内所有的学校最终都能得到软件。问题2:至少需要添加几条传输线路(边),使任意向一个学校发放软件后,经过若干次传送,网络内所有的学校最终都能得到软件。input format:输入有多组样例,大约1000组。每组样例第一行包含两个整数N,M(2<=N<=100),N代表学校的个数,M代表边的个数(M<N*N)接下来M行,每行包含连个整数u,v,代表u可以向v单向发送数据。output format每组样例对应两行,分别是问题一和问题二的解。sam 阅读全文

posted @ 2012-08-07 09:03 getgoing 阅读(219) 评论(0) 推荐(0) 编辑

[简单DP] COJ 1122 Game

摘要: 这道题直接模拟即可,DP相当于一个优化,记录下从第i行第j列出发后到达的最终位置,下次需要时直接取,优化前后最坏情况下复杂度都是O(10^6)。# include <cstdio># include <cstring> # define N 1000 + 5 int n, m;int cnt[N], ff[N], f[N][N];char g[N][N]; int down(int row, int col){ int &ans = f[row][col]; if (ans != -1) return ans; if (row == n) return ans 阅读全文

posted @ 2012-08-07 07:13 getgoing 阅读(757) 评论(0) 推荐(0) 编辑

导航