05 2012 档案

摘要:multiset 第一次用,太神奇了题意:push a 把a压栈;pop b 把小于等于b的所有元素中最大的元素的出栈,若没有则输出“No Element!”!View Code #include<iostream> #include<stdio.h> #include<set> using namespace std; int main() { multiset<int> st; multiset<int>::iterator it; int n; char op[5]; int tp; while(scanf("%d&q 阅读全文
posted @ 2012-05-25 22:32 枕边梦 阅读(284) 评论(0) 推荐(0)
摘要:题意:题目的意思很清晰,对于一个有向图,将N个点划分成最少的集合个数,同时满足俩个条件:1) 任意俩点,若互相可达,则必须在同一个集合中2)属于同一个集合的任意俩个点对(u,v),至少存在一条路径,使得v对于u 可达 或者 u 对于v 可达分析:对于上述俩个条件,为了简化问题,需要进行缩点,属于同一个强连通分量的点,缩成同一个点,重新构图,可以用tarjan 算法;这样,第一个条件就一定满足了,接着只剩下第二个条件了,其实,任意俩点,只要在同一条有向路径上,则可以属于一个集合,,,那么问题就转化为用最小的有向路径去覆盖所有的点(最小路径覆盖数==点数-最大匹配数)View Code #incl 阅读全文
posted @ 2012-05-19 20:49 枕边梦 阅读(230) 评论(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 枕边梦 阅读(424) 评论(2) 推荐(0)