图论
文章平均质量分 56
ThunderSei
这个作者很懒,什么都没留下…
展开
-
求树中最长路径 树的直径
使用两次BFS,第一次BFS在任意位置,所找到的最远端点是直径的一个端点。第二次BFS从第一次BFS得到的最远端开始,两次得到的端点间的这条路径即为最长路径。证明;一:第一次BFS得到的最远端是直径的一个端点。若开始点V是直径上的点,必然到达的最远端是直径上某端点(反证)若不是则必然与直径相交,若从V至最远端的这条路径与直径不相交,则从最远端到V再抵达直径某端点这条路径必然远于原创 2013-05-16 21:43:17 · 1328 阅读 · 0 评论 -
lightoj 1168 tarjan 强联通分量加缩点 加各种题目坑
#include#include#include#include#includeusing namespace std;vector G[2000];vector C[2000];int dfn[2000];int low[2000];int cmp[2000];stack sta;bool instack[2000];bool used[2000];int top原创 2013-11-11 12:49:20 · 737 阅读 · 0 评论 -
lightoj 1003 强联通模板题
#include#include#include#include#include#include#includeusing namespace std;map mp;vector topo;vector G[12000];vector rG[12000];int cmp[20000];int num_kind=0;int used[20000];void dfs(原创 2013-11-10 21:34:33 · 726 阅读 · 0 评论 -
lightoj 1034 贪心 拓扑排序
#include#include#includeusing namespace std;vector G[15000];int nv,ne;vector topo;bool used[20000];void dfs(int n){ used[n]=1; for(int i=0;i<G[n].size();i++) { int v=G[n][i]; if(!used原创 2013-11-10 22:10:46 · 844 阅读 · 0 评论 -
hangzhou 02
#include#include#include#include#include#includeusing namespace std;const int INF=12345678;int n,m;struct P{ int x,y; P(int a,int b) { x=a; y=b; } P(){}};int b[200][200];queue q原创 2013-11-09 14:21:27 · 671 阅读 · 0 评论 -
lightOJ 1002 最小瓶颈树 ..
第一次要把最小生成树保存下来。还是对算法理解有问题。一开始的时候要把起始点设置为1,并把所有的相连边加入队列中。自己写edge的时候不喜欢记录来源,所以用了个Pair,实在捉鸡,可以直接写成带有from的struct,这样代码复杂度会减少很多。#include#include#include#include#include#includeusing namespace st原创 2013-11-08 17:24:55 · 609 阅读 · 0 评论 -
POJ3009 DFS 但主要问题是抽象代码的方法
一会再编辑#include#includeint b[200][200];const int MAX=9999;int step=MAX;int h,w;int dir[4][2]={0,1,1,0,0,-1,-1,0};void dfs(int x,int y,int n){ if(n>=10) return ; n++; int i=x,j=y,k; in原创 2013-10-27 23:13:48 · 537 阅读 · 0 评论 -
POJ3255
求次短路,先求出1到所有点的距离dist,再求出N到所有点的距离dist[1],然后遍历所有边 dist[u]+cost[u][v]+dist1[v]第二的就是次短路。#include#include#include#include#include#include#includeusing namespace std;const int INF=0x3f3f3f3f;原创 2013-10-23 18:15:11 · 603 阅读 · 0 评论 -
tarjian算法 最大强连通分支
先记下思路,使用今后再更新tarjian算法是利用DFS寻找最大连通分支的算法,算法只需要对图进行一次DFS,无论时间复杂度还是代码复杂度都不是太高。思路就是先利用DFS构造一棵树,那么分成四种边——树边、前向边、后向边、交叉边。前向边在环中等价于树边 (请画图验证) ,因此直接忽略,交叉边在树中不构成环(依然画个图...),只有后向边构成环(还是画个图),因此,重点就是利用后向边,找到原创 2013-05-16 01:02:15 · 1391 阅读 · 0 评论 -
lightoj 1210 最少加边,使得图变成强联通
huilaizai xie#include#include#include#include#includeusing namespace std;#define MS(x) memset(x,0,sizeof(x))stack S;vector G[23000];vector C[23000];bool used[25000];int dfn[25000];in原创 2013-11-11 21:11:30 · 659 阅读 · 0 评论