随笔分类 -  拓扑

摘要:强连通分量题意:给一个有向图,对于图中任意两个点u,v,如果从u能到v,或者,v能到u,则这对顶点是可行的,如果图中任意一对顶点都是可行的,可以输出Yes,否则输出No这个的话,就不是裸的强连通分量了。思考一下,对于一个有向图而言,里面的强连通分量肯定满足题目的条件,因为强连通分量内是u可到v,而且,v可到u,所以我们第一步工作就是强连通分量缩点,变为一个DAG。对于这个DAG里面的任意两个点U,V,如果满足题目的条件,那么点U,V里面包含的原图的点也肯定是满足的所以问题转化为怎么判断这个DAG是满足题目条件呢?其实判断很简单,就是看这个DAG里面有多少个点的入度为0,多少个点出度为0如果DA 阅读全文
posted @ 2013-05-23 11:15 Titanium 阅读(993) 评论(1) 推荐(0)
摘要:选拔赛的题目,关键路径继续延续着比赛的时候做不出,一回宿舍就1A的悲惨命运。这题题意还是很易懂的,不说题意了,然后一看就是一个关键路径。一个例子就是造汽车,造各种零件的时间不同,要凑齐一些零件后才能造另一些零件,问最后汽车最早什么时候造完。有个关键就是,如果一些零件还没有造完,而你手头上有事情可做,那么就去做,千万不要等那个零件,这样就是最优的。如果手头上没有事情可做,都是在等待的,那么只好等待了,而等待到某一个事情能开始做了,那么就做去做,就变回了上面的那种情况,但是要记得把刚才等待的时间算上去这个其实算是模板题,关键路径大家都学过,但是不一样都做过题,我细想才发现原来我没做过这类题只是知道 阅读全文
posted @ 2013-03-23 20:56 Titanium 阅读(410) 评论(0) 推荐(0)
摘要:在poj上也有 是poj 1420,在poj上AC了,但是在UVA上RE题意:很好理解就是给你一个表格,一些元素已经有数字了,一些元素还不知道,但是它等于某些元素相加的和,要你补完整个表格(行用1到999表示,列用大写字母来表示,用ABC开始一直到ZZZ,这个很容易算出来,26+26*26+26*26*26=18278,字符处理有些麻烦,代码中的funtion函数)这个东西一开始没想到是什么,后来喵了一下解题报告说是拓扑排序,瞬间就懂了,因为有些元素是未知的,未知的元素是由已知的元素相加得到的,那么就是有一个优先关系,看sample就看得出来然后数据较大,打了一半不知道要怎么做了,然后又轻轻喵 阅读全文
posted @ 2012-11-14 18:10 Titanium 阅读(534) 评论(0) 推荐(0)
摘要:拓扑排序的裸体,全裸的那种一点变形和要求都没有用DFS来实现//用dfs解决拓扑排序//用一个标记数组vis来标记//0表示还没有访问过,1表示正在访问,2表示已经访问过并且存入拓扑数组#include <stdio.h>#include <string.h>#define MAX 110int g[MAX][MAX],vis[MAX];int n,m,c,top[MAX];int dfs(int u){ int v; vis[u]=1; for(v=1; v<=n; v++) if(g[u][v]) { if(vis[v]==1) return 0; ... 阅读全文
posted @ 2012-10-17 19:13 Titanium 阅读(193) 评论(0) 推荐(1)
摘要:拓扑排序入门题,可以用STL来做,这份代码中没有用对于给出的图判断是否为有向无环图(dag),若不是,输出-1其实是按层来处理拓扑序列,算法是先找出入度为0的点,然后删除所有以这些顶点为弧尾的弧,使弧头的入度减1,然后再看下一轮的顶点中那些顶点入度为0,然后依此类推,直到所有点的入度都为0,如果最后结束的时候所有点入度为0,那么是一个dag,否则不是,输出-1,这个过程可以用队列来实现,这个代码里面没有这样做,而是每一层都重新扫描一遍,找出入度为0的顶点(之前已经纳入拓扑序列的顶点就用vis[i]=1来标记),应该用队列实现的话时间会更好另外其中是要构建邻接表的,用数组来构建,当然可以直接用S 阅读全文
posted @ 2012-10-17 18:45 Titanium 阅读(908) 评论(0) 推荐(0)
摘要://拓扑排序裸题,题目要求按编号从小到大输出,要换一种思维去思考//按照数据结构课本的算法,建立邻接表,用栈实现。初始化先将入度为0的顶点入栈,然后以栈顶顶点为准,先将栈顶顶点出栈输出它的信息,然后扫描它的邻接表,没找到一个弧头就将其入度减1,减1后判断该弧头是否入度为0,是的话就入栈。直到所有顶点都出栈那么就输出了一个拓扑序列。但是这样做不能保证编号从小到大输出 为了保证从小到大输出,要用“每次都从头来过”的思想,因为题目保证一定存在拓扑序列,所以对于n个点,一定输出n次,所有外循环是次数,找到了n次,输出n个点,然后每次找,都是按照编号从1找到n,所以内循环是对应顶点的编号,从1到n,从当 阅读全文
posted @ 2012-10-16 23:48 Titanium 阅读(190) 评论(0) 推荐(0)