摘要: 树形dp 结合01背包View Code 1 #include<cstdio> 2 #include<cstring> 3 #define max(a,b) a>b?a:b 4 const int INF = 1000000000; 5 const int maxn = 3010; 6 int head[maxn],dp[maxn][maxn],n,m; 7 int num[maxn]; 8 struct EDGE{ 9 int v,w,next;10 }edge[maxn];11 int tot;12 void add_edge(int s,int t,int 阅读全文
posted @ 2012-03-17 12:10 静静的等待_93 阅读(303) 评论(0) 推荐(0)
摘要: 神题。注意dfs过程。该树可以为多叉树。View Code #include<iostream>#include<cstdio>#include<cstring>#include<vector>#define maxn 101using namespace std;vector<int>mp[maxn];bool used[maxn];int n,v,val[maxn];int dp[2][maxn][210];void dfs(int s){ int i; for(i=0;i<=v;i++) { dp[0][s][i]=dp[ 阅读全文
posted @ 2012-03-15 19:25 静静的等待_93 阅读(235) 评论(1) 推荐(0)
摘要: 第k小的数字 树状数组View Code 1 #include<iostream> 2 #include<cstdio> 3 #define maxn 200005 4 using namespace std; 5 int c[maxn],p[maxn],a[maxn]; 6 int N,M,C; 7 void add(int x,int num) 8 { 9 while(x<=N)10 {11 c[x]+=num;12 x+=(x&-x);13 }14 }15 int find(int x)16 {17 if(x==p[x])... 阅读全文
posted @ 2012-03-14 17:42 静静的等待_93 阅读(227) 评论(0) 推荐(0)
摘要: 两种排序。不解释View Code 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 const long long maxn=500005; 7 struct node 8 { 9 long long x;10 long long i;11 }e[maxn];12 bool cmp(node a,node b)13 {14 return a.x<b.x;15 }16 bool 阅读全文
posted @ 2012-03-13 20:39 静静的等待_93 阅读(124) 评论(0) 推荐(0)
摘要: 简单搜索不解释View Code #include<iostream>#include<cstdio>#include<cstring>#include<vector>#define maxn 110using namespace std;int n,m,s,t;bool isval[maxn],vis[maxn];vector<int>mp[maxn];bool dfs(int u){ if(isval[u]==1) return 1; vis[u]=1;bool flag=0; for(int i=0;i<mp[u].siz 阅读全文
posted @ 2012-03-12 19:48 静静的等待_93 阅读(192) 评论(2) 推荐(0)
摘要: 强连通分量 不解释View Code 1 #include<iostream> 2 #include<vector> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 const int maxn=5005; 7 int dfn[maxn],vis[maxn],low[maxn],d[maxn]; 8 vector<int>mp[maxn]; 9 bool map[maxn][maxn];10 int cnt;11 void dfs(int u,int pr 阅读全文
posted @ 2012-03-12 17:13 静静的等待_93 阅读(110) 评论(0) 推荐(0)
摘要: 概率dp,不解释。View Code #include<iostream>#include<map>#include<cstdio>#include<vector>using namespace std;const int maxn=201;int dp[210][2];vector<int>edge[maxn];void dfs(int u,int p){ int i,j; dp[u][1]=1;dp[u][0]=0; for(i=0;i<edge[u].size();i++) { int v=edge[u][i]; // i 阅读全文
posted @ 2012-03-11 11:48 静静的等待_93 阅读(118) 评论(0) 推荐(0)
摘要: SAP算法框架:1、定义距离标号为各点到汇点距离的下界(即最短距离)。2、在初始距离标号的基础上,不断沿着可行弧找增广路。3、遍历当前节点完以后,为了保证下次再来的时候有路可走,重新标号当前距离。4、检查重新标记的顶点,若其为原点,且被标记的高度等于节点个数时,图中已经不存在增广路,算法可结束。否则继续从原点开始遍历。由于我们不停的遍历,最大流很可能便早就已经求出来了。那么我们接下来的遍历便成了无用功。可以发现,距离标号是连续单调变化的。如果某一种大小标号的节点数量为零。也就是出现了不连续,断层!那么图中也不肯能再存在增广路了。实践中,我们用一个vh[ i ]数组用来记录标号为i的顶点的个数, 阅读全文
posted @ 2012-03-10 16:05 静静的等待_93 阅读(1502) 评论(0) 推荐(0)
摘要: 可以作为KM 二分图最大权匹配模板View Code #include <stdio.h>#include <iostream>#include <string.h>using namespace std;const int N=210;const int inf=0x2fffffff;const int Max=20000;int match[N],n,m,lack,w[N][N],lx[N],ly[N];bool vx[N],vy[N];bool dfs(int x){ vx[x]=1; for(int i=1;i<=n;i++) { if(vy[ 阅读全文
posted @ 2012-03-08 19:33 静静的等待_93 阅读(180) 评论(0) 推荐(0)
摘要: 这一题就是二分图,因为题目中成绩的跨度远远比人数大,所以说如果匹配人数,效果更好。这里就用简单的二分图了。View Code #include<iostream>#include<map>#include<cstring>#include<cstdio>#include<vector>#include<algorithm>using namespace std;const int maxn=100005;vector<int>v[maxn];int vis[maxn],match[maxn];int t[max 阅读全文
posted @ 2012-03-07 20:01 静静的等待_93 阅读(236) 评论(0) 推荐(0)