摘要: 题意:求出1到N 的无向图的无重复边的最短路径数(即所有的最短路径没有公共边)分析:先求出最短路,再找出所有属于最短路的边(满足dist[u]+g[u][v]==dist[v]),把有向边(u,v)加入到新图中,容量为1,(即每条边只能用一次),最后求一次源点为1,汇点为t的最大流即可View Code #include<iostream>#include<algorithm>#include<string>#include<vector>#include<stack>using namespace std;const int N = 阅读全文
posted @ 2012-04-13 19:42 枕边梦 阅读(296) 评论(0) 推荐(0) 编辑
摘要: 很明显的状态转移方程式:dp[i]=max(dp[j])+g[i], (0<=j<i && h[i]>h[j])不过注意到题目中n的范围有10000 ,n^2的算法…………我们可以用线段树优化一下先对高度离散化,作为线段树左右区间的端点这样,求dp[i]时,只需要查出高度(0,h[i]-1]范围内的最大值t,那么dp[i]=t+g[i], 之后,接着,更新线段树中高度为g[i],值为dp[i]的点View Code #include<iostream>#include<algorithm>#include<string>#i 阅读全文
posted @ 2012-04-13 16:30 枕边梦 阅读(401) 评论(0) 推荐(0) 编辑
摘要: 题意:有n批人,m艘船,每艘船的容量为K, 让第i 批人上船可获利bi,但是会占据ai+1个船位,而且,整批人都在必须在同一艘船上,而且,优先级别高的那批人必须在优先级别低的人前面(包括船的所在编号,hint里面有提示)分析:参照大牛的思路,太牛逼了,dp[i]表示获得价值i需要最少的代价(占据的船位,同时保证同一批人在同一艘船上)就是一个类似01背包的过程了(同时也保证了优先级别),不过每一批人花费的代价要重新计算(根据前一个状态下剩余的船位)View Code #include<iostream>#include<algorithm>#include<stri 阅读全文
posted @ 2012-04-13 14:30 枕边梦 阅读(351) 评论(0) 推荐(0) 编辑
摘要: 分析:当N为奇数时奇偶同性可互达,N为偶数时,逆序数之和sum加上空格所在行距目标空格行的距离dis之和要和终点状态逆序数同奇偶View Code #include<iostream>#include<algorithm>#include<string>using namespace std;const int N = 300+10;int s[N*N],g[N*N];#define _cp(a,b) ((a)<=(b))int _tmp[N*N];int inv(int n,int* a){ int l=n>>1,r=n-l,i,j; i 阅读全文
posted @ 2012-04-13 09:45 枕边梦 阅读(525) 评论(0) 推荐(0) 编辑
摘要: 二分距离,求最大团,看是否>=KView Code #include<iostream>#include<algorithm>#include<string>#include<math.h>using namespace std;const int N = 50+10;int dis[N][N],dd[N*N];int dp[N];bool inset[N],g[N][N];int n,best,ord[N],deg[N];bool found;inline void Memcpy(bool *d,bool *s){ for(int i=0 阅读全文
posted @ 2012-04-13 09:24 枕边梦 阅读(435) 评论(0) 推荐(0) 编辑