|
|
|
|
|
摘要:
很经典的题,我是学习的罗老的代码。就是给出一些矩形,求所有矩形重叠后最终图形的边长。思路就是(内部资料,不得外传)。这题的一个坑就是矩形的边重合时的情况。 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 #define N 5005 5 #define M 20005 6 int ans; 7 struct Seg 8 { 9 int x,y1,y2;10 bool f;11 Seg(){}12 Seg(int a,int b,int c,bool d)13 {14 ... 阅读全文
posted @ 2012-11-08 23:21
Siriuslzx
阅读(174)
推荐(0)
编辑
摘要:
树形DP,一棵树有N个结点,给出一个P,要求切断最少的边使树的规模达到P。这题我是参考的别人的代码,状态转移方程最初很难理解,后来明白了,它扫描时,默认父结点是光杆司令一个,随着扫描子树才把子树连到父结点上。 1 #include <stdio.h> 2 #define N 152 3 int fst[N],nxt[N],notrt[N]; 4 int dp[N][N],n,p; 5 void dfs(int u) 6 { 7 int i,j,v,t; 8 for(i = 0; i <= p; i++) dp[u][i]=N; 9 dp[u][1] = 0;10 ... 阅读全文
posted @ 2012-11-08 23:17
Siriuslzx
阅读(186)
推荐(0)
编辑
摘要:
树形DP,还是求最大独立集,加上判断唯一性,这题我就卡在唯一性上了。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 205 4 int fst[N],nxt[N],v[N],n,m; 5 int only[N][2],dp[N][2]; 6 char name[N][105]; 7 int max(int a, int b) 8 { 9 return a>b ?a :b;10 }11 int find(char *t)12 {13 for(int i = 0; i < m; i++)14 if( 阅读全文
posted @ 2012-11-08 23:12
Siriuslzx
阅读(153)
推荐(0)
编辑
摘要:
和poj 1655类似,也是拆了一个树求什么值。这题我改进了一下,把两个DFS合一了。 1 #include 2 #define N 50005 3 int fst[N],nxt[N w[u]) w[u]=s[v];23 }24 }25 if(t > w[u]) w[u]=t;26 //printf("w[%d]:%d\n",u,w[u]);27 if(w[u] < min) min = w[u];28 return s[u];29 }30 int main()31 {32 int a,b,i,j,f=1;33 scan... 阅读全文
posted @ 2012-11-08 23:10
Siriuslzx
阅读(164)
推荐(0)
编辑
摘要:
并查集,求和0号同集合的点有多少个。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 30005 4 int fa[N],num[N]; 5 int find(int a) 6 { 7 if(fa[a] == a) return a; 8 return fa[a] = find(fa[a]); 9 }10 void unin(int a,int b)11 {12 a = find(a);13 b = find(b);14 if(a == b) return;15 if(num[a] >... 阅读全文
posted @ 2012-11-08 23:05
Siriuslzx
阅读(118)
推荐(0)
编辑
摘要:
给出一个树,若去掉其中一个结点,剩下的子树中规模最大的树的规模(估且称为D值),就是该点的D值。求所有结点中D值最小的点,输出点及其D值。这题用两次DFS,第一次求出所有结点的子结点数,第二次求出所有结点的D值。 1 #include <stdio.h> 2 #include <string.h> 3 #include <vector> 4 #define N 20005 5 using namespace std; 6 vector<int> ed[N]; 7 int s[N],w[N],n; 8 int max(int a,int b) 9 阅读全文
posted @ 2012-11-08 23:03
Siriuslzx
阅读(143)
推荐(0)
编辑
摘要:
最小支配集,题目不难,就是它给出数据的方式有点CD。 1 #include <stdio.h> 2 #include <string.h> 3 #define N 1505 4 int to[N][12]; 5 int all[N],dp[N]; 6 bool root[N]; 7 int min(int a,int b) 8 { 9 return a<b ?a :b;10 }11 void dfs(int u)12 {13 int v,i,cnt=0;14 dp[u] = 1;15 all[u] = 0;16 for(i = 1; i <= to[u].. 阅读全文
posted @ 2012-11-08 22:58
Siriuslzx
阅读(131)
推荐(0)
编辑
摘要:
树形DP,其实就和求最大独立集差不多,不同的是每个结点的权值不是0和1,而是一个int。最初我还费老大心思想当权值为负时的情况,后来才明白不需要。 1 #include <stdio.h> 2 #include <string.h> 3 const int N = 6010; 4 int fst[N],nxt[N],dp[N][2],v[N]; 5 bool root[N]; 6 int max(int a,int b) 7 { 8 return a>b ?a :b; 9 }10 void dfs(int p)11 {12 int e,q;13 for(e = f 阅读全文
posted @ 2012-11-08 22:54
Siriuslzx
阅读(188)
推荐(0)
编辑
摘要:
并查集进阶,除了用父亲数组保存父结点外,再用一个数组表示子结点与父结点之间的关系,查找与合并时都涉及到关系数组的修改。 1 #include <stdio.h> 2 #include <string.h> 3 int rank[50010],fa[50010]; 4 int find(int n) 5 { 6 int t = fa[n]; 7 if(fa[n] != n) 8 fa[n] = find(fa[n]); 9 rank[n] = (rank[n]+rank[t])%3;10 return fa[n];11 }12 void uni(i... 阅读全文
posted @ 2012-11-08 22:51
Siriuslzx
阅读(146)
推荐(0)
编辑
摘要:
水题,判断是否是一棵树,如果一个结点有多个父亲or图中有环就不是。 1 #include <stdio.h> 2 #include <string.h> 3 int fa[1005],v[1005]; 4 int Find(int n) 5 { 6 if(fa[n] == -1) 7 return n; 8 fa[n] = Find(fa[n]); 9 return fa[n];10 }11 int main()12 {13 int ca=1,a,b,i,j,f;14 bool ok;15 while(scanf("%d%... 阅读全文
posted @ 2012-11-08 22:47
Siriuslzx
阅读(147)
推荐(0)
编辑
|
|