上一页 1 2 3 4 5 6 7 ··· 34 下一页
摘要: 题意:题目的意思很清晰,对于一个有向图,将N个点划分成最少的集合个数,同时满足俩个条件:1) 任意俩点,若互相可达,则必须在同一个集合中2)属于同一个集合的任意俩个点对(u,v),至少存在一条路径,使得v对于u 可达 或者 u 对于v 可达分析:对于上述俩个条件,为了简化问题,需要进行缩点,属于同一个强连通分量的点,缩成同一个点,重新构图,可以用tarjan 算法;这样,第一个条件就一定满足了,接着只剩下第二个条件了,其实,任意俩点,只要在同一条有向路径上,则可以属于一个集合,,,那么问题就转化为用最小的有向路径去覆盖所有的点(最小路径覆盖数==点数-最大匹配数)View Code #incl 阅读全文
posted @ 2012-05-19 20:49 枕边梦 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 题意: 给定一个有向图,有路径(边)权值和节点的权值,求一个字典序最小的最短路径(中间节点权值+路径权值)分析:此题目需要对floyd算法有比较深的了解,首先floyd是一个不断拓展路径的过程,同时也是不断增加中间节点的过程,所以累加中间节点权值的部分很好处理。理解了floyd 算法的过程之后,记录路径也非难事,关键是题目要求的是字典序最小的最短路径。记录路径有俩种方式:1)path[i][j]记录起点为i ,终点为j 的路径上j 的直接前驱View Code void init(int n){ for(int i=1;i<=n;i++) for(int j=1;j<=n;... 阅读全文
posted @ 2012-05-05 14:21 枕边梦 阅读(412) 评论(2) 推荐(0) 编辑
摘要: 经典的树形游戏的博弈题目给定一棵树,虽然是规定给定一棵根为1树,但数据给的是树枝,所以是无向的,坑爹啊View Code #include<iostream>#include<algorithm>#include<string>#include<vector>using namespace std;const int N = 100000+10;vector<int> g[N];bool vis[N];int w[N];void dfs(int u){ vis[u]=true; int size=g[u].size(); w[u]=0 阅读全文
posted @ 2012-04-20 13:46 枕边梦 阅读(214) 评论(0) 推荐(0) 编辑
摘要: 题意很浅显,给定当前下载任务的已选状态和最终状态,可以当过单选,全选,反选等三个操作达成,问最少的操作数分析:思维真的有很大的局限性,怎么就没想到去整理一下规律呢,一心只想着搜索,dp呀,虽然这俩方面都很水……看了大牛的解释,我也跟着恍然大悟了……View Code #include <stdio.h>#include <stdlib.h>#include <string.h>int main(){ char S[55],T[55]; int i,j; int Min,count[4],n; while (scanf("%d",& 阅读全文
posted @ 2012-04-17 21:11 枕边梦 阅读(185) 评论(0) 推荐(0) 编辑
摘要: pku2899 Jamie's Contact Groups题意:在通讯录中有N个人,每个人能可能属于多个group,现要将这些人分组m组,设各组中的最大人数为max,求出该最小的最大值分析:二分group的最大值,+二分图多重匹配View Code #include<iostream>#include<algorithm>#include<string>using namespace std;const int N = 1000+10;const int M = 500+10;int n,m;int map[N][M],vlink[M],link[ 阅读全文
posted @ 2012-04-15 15:51 枕边梦 阅读(1700) 评论(0) 推荐(0) 编辑
摘要: 很明显的一个二分图多重匹配,一开始用网络流直接建图,悲剧的TLE了之后,看了网上解释,缩点,确实大大简化了问题,也就可以AC了,600+ms一开始是这样建图的,先有虚拟源点s,汇点t,从s向每一个人连一条容量为1的边,每一个人向他适合的每一个planet连一条容量为1边,再从每一个planet连一条容量为w[i](该planet的容量)的边,很明显,判断最大流是否等于n即可。n为100000,而m只有10其实,在这道题目里面,人是无差别的,有区别是他们各自的选择,而总共只有10个planet,也就是所有的选择数也就(1<<10)种,所有选择都相同的人完全是等价的!!!可是,没想到还 阅读全文
posted @ 2012-04-15 14:34 枕边梦 阅读(1288) 评论(0) 推荐(0) 编辑
摘要: 网上很多用线段树做的,,好复杂,,,这个是用纯STL做的,map+set转自http://blog.csdn.net/zz_1215/article/details/7318800View Code #include<iostream>#include<vector>#include<algorithm>#include<string>#include<map>#include<set>using namespace std;map<int, set<int> > m;//x映射到一个y坐标的集合m 阅读全文
posted @ 2012-04-15 09:35 枕边梦 阅读(285) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个矩形,将矩形切成给定任意个数的小矩形,当然每一个小矩形都有对应的权值,求最大权值分析:其实,就是一个类似完全背包的问题dp[i][j]表示从(0,0)到(i,j)对应的矩形可以切出小矩形的最大权值和View Code #include<iostream>#include<algorithm>#include<string>using namespace std;const int N = 1000+10;struct rec{ int x,y; int p;}r[15];int dp[N][N];int main(){ int T,n,X,Y; 阅读全文
posted @ 2012-04-14 20:49 枕边梦 阅读(334) 评论(0) 推荐(0) 编辑
摘要: 题意:求出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) 编辑
上一页 1 2 3 4 5 6 7 ··· 34 下一页