
图论
文章平均质量分 73
ACdreamers
这个作者很懒,什么都没留下…
展开
-
并查集基础
并查集是一种树型的数据结构,用于处理一些不相交集合的合并问题并查集的主要操作有:1-合并两个不相交集合 2-判断两个元素是否属于同一个集合 3-路径压缩并查集的两种优化方法:路径压缩与按秩合并。(1)初始化原创 2012-06-17 20:28:48 · 3754 阅读 · 0 评论 -
求树的重心
题目:http://poj.org/problem?id=1655题意:给定一棵树,求树的重心的编号以及重心删除后得到的最大子树的节点个数size,如果size相同就选取编号最小的.分析:首先要知道什么是树的重心,树的重心定义为:找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心.原创 2013-11-23 20:08:12 · 18571 阅读 · 3 评论 -
深度理解链式前向星
我们首先来看一下什么是前向星.前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.用len[i]来记录所有以i为起点的边在数组中的存储长度.用head[i]记录以i为边集在数组中的第一个存储位置.那么对于下图:原创 2013-11-23 16:55:12 · 75309 阅读 · 75 评论 -
HDU4607(求树中的最长链)
题目:Park Visit题意:给定一棵树,从树中的任意选一个顶点出发,遍历K个点的最短距离是多少?(每条边的长度为1)解析:就是求树的最长链,假设求出的树的最长链所包含的点数为m,那么如果K#include #include #include using namespace std;const int N=200010;int head[N],原创 2013-07-23 18:24:45 · 4514 阅读 · 0 评论 -
POJ2236(并查集)
题目:http://poj.org/problem?id=2236 题意:给定n个点的坐标,然后选出其中的一些点出来,问在这些点中的指定的两点是否连通。#include #include #include using namespace std;const int N = 1005;struct Point{ int x,y;};P原创 2013-09-26 16:29:54 · 2473 阅读 · 0 评论 -
POJ2762(判断无向图的弱连通)
题目:http://poj.org/problem?id=2762 题意:给出n个山洞,对于每个山洞,如果任意选择两点s,e,都满足s可以到达e或者e可以到达s,则输出Yes,否则输出No。 分析:实际上判断是否弱连通,所以首先强连通,然后缩点,对缩点形成的图最多只能有一个入度为0的点,如果有多个入度为0的点,则这两个连通分量肯定是不连通的。缩点后形成的图形是一棵树,入度为0的原创 2013-09-26 15:07:19 · 2496 阅读 · 0 评论 -
HDU2586(最近公共祖先的Tarjan算法)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2586 题意:给一棵树,询问u和v之间的边权和。#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include using namespace std;原创 2013-09-24 11:27:14 · 3918 阅读 · 0 评论 -
POJ1330(最近公共祖先)
题目:http://poj.org/problem?id=1330 最近公共祖先的离线算法:#include #include #include #include using namespace std;const int N = 10005;int n;vector vec[N];int pre[N];bool vis[N];bool原创 2013-09-22 16:28:39 · 3226 阅读 · 0 评论 -
拓扑排序
拓扑排序就是把一个图的所有节点排序,使得每一条有向边(u,v)对应的u都排在v的前面。 拓扑排序的一个用途就是判断一个有向图是否有环。 性质1、拓扑排序在有向无环图中才能排出有效的序列,否则能判断该有向图有环。2、如果输入的有向图中的点,不存在入度为0的点,则该有向图存在回路3、如果存在的入度为0的点大于一个,则该有向图肯定不存在一个可以确定的拓扑序列但并不妨碍拓扑排序原创 2013-09-19 13:35:33 · 4858 阅读 · 0 评论 -
二分图判断
题目:The Accomodation of Students 二分图是这样一个图: 有两顶点集且图中每条边的的两个顶点分别位于两个顶点集中,每个顶点集中没有边相连接!判断二分图的常见方法是染色法: 开始对任意一未染色的顶点染色,之后判断其相邻的顶点中,若未染色则将其染上和相邻顶点不同的颜色, 若已经染色且颜色和相邻顶点的颜色相同则说明不是二分图,若颜色不同则继续判断,用简单的DF原创 2013-03-08 15:11:22 · 13940 阅读 · 0 评论 -
ZOJ1654(二分构图题典例)
题目:Place the Robots 本题和HDU1054 Fire Net有点相似,不过有很大差别。 题意:有一个N*M(N,M有墙,则它们可以互相攻击。问给定的棋盘,最多可以放置多少个机器人,使它们不能互相攻击。#include #include #define N 1250int vN,uN;char map[N][N];int g[原创 2013-03-09 16:14:58 · 3263 阅读 · 1 评论 -
最短路径之Spfa算法
题目:宫锁珠帘#include #include #define INF 99999999#define N 105int map[N][N];int dist[N];int visit[N];int q[100*N];int n,m;void Spfa(int s){ int i,head,tail,temp; mems原创 2013-02-25 18:50:34 · 1440 阅读 · 0 评论 -
Floyd求传递闭包
在用Floyd求传递闭包时如果数据很大时就得用if语句优化,否则会超时,例如下面的第二题就是这样。 题目:变形课#include #include int map[28][28];void Floyd(){ int i,j,k; for(k=0;k<26;k++) for(i=0;i<26;i++)原创 2013-02-28 15:39:43 · 3996 阅读 · 0 评论 -
匈牙利算法详解
题目:Strategic Game 用vector实现邻接表的匈牙利算法。典型的最小顶点覆盖!最小顶点覆盖=最大匹配(双向图)/2;此题有个小细节,数据较大,要用邻接表,不然会超时! 最小顶点覆盖:选出最少的点,这些点的关联的边都被覆盖最小顶点覆盖等于最大匹配 真正求二分图的最大匹配的题目很少,往往做一些简单的变化:变种1:二分图的最小顶点覆盖 最小顶点覆盖要求原创 2013-02-28 11:10:49 · 23081 阅读 · 0 评论 -
次小生成树
次小生成树:在求最小生成树时,用数组path[i][j]来表示MST中i到j最大边权。求完后,直接枚举所有不在MST中的边,把它加入到MST中构成一棵新的树,且该树有环,此环是由刚加入的边(I,j)造成的,所以可以通过删除path[i][j]即可得到新的一颗树,且所有的该类树中必有一棵为次小生成树。比如如图所示:G,H不是MST上的边,通过加入边(G,H),得到一个环(B,原创 2013-02-12 15:03:17 · 1308 阅读 · 0 评论 -
最小生成树
最小生成树的普利姆算法:#include #include #define MAX 100#define INF 100000int creatcost(double cost[][MAX],int vexn,int edge){ double w; int i,j; int v1,v2; for(i=1;i<=vexn;i++) for(j=1原创 2012-09-24 20:01:31 · 1424 阅读 · 0 评论 -
并查集求欧拉回路/通路
题目:Play on Words 不过对于欧拉回路/通路的结论,倒是不难推出。欧拉通路:除首尾结点外,其余结点入度等于出度,起点出度减入度等于1,终点入度减出度等于1欧拉回路:所有结点的入度都等于出度思路:将每一个单词的首尾字母当做结点,首尾字母间连线,判断最后形成的有向图能否形成欧拉通路/回路,用并查集。#include#include#define N 27原创 2012-11-29 03:52:05 · 1723 阅读 · 0 评论 -
差分约束系统之Bellman_Ford与Spfa判断负权回路
学习差分约束系统请戳这里。 题目:POJ1364#include #define INF 99999999#define N 105typedef struct{ int s; int e; int v;}node;node edge[N];int dist[N];int index,n;void add(i原创 2013-02-26 19:34:41 · 3314 阅读 · 2 评论 -
单源最短路径(Dijkstra算法)
1.Dijkstra算法: 算法思想:对于稀疏矩阵应采用邻接表的方式存储更好。 #include #include #define MAX 100#define INF 100000int cost[MAX][MAX];int dist[MAX],pre[MAX];void creatcost(int cost[][MAX],int vexn,int原创 2012-09-25 14:45:46 · 1955 阅读 · 0 评论 -
最短路径之Floyd算法
深度学习Floyd_Warshall算法请戳这里。 模板题:宫锁珠帘#include const int INF=1000010;int n,m;int s,t;int a,b,x;int dist[105][105];int map[105][105];void init(){ int i,j; for(i=1;i<=n原创 2013-02-17 23:16:14 · 1448 阅读 · 0 评论 -
HDU4514(非连通图的环判断与图中最长链)
题目:设计风景线 题意:给定一个无向图,图可能是非连通的,如果图中存在环,就输出YES,否则就输出图中最长链的长度。 分析:首先我们得考虑这是一个无向图,而且是非连通的,那么就不能直接像求树那样来求最长链。对于本题,首先得判断环,在这里我们就用并查集判环,因为并查集本身就是树型结构,如果要连接的两点的祖先都相同,那么就已经有环了,这样直接输出YES,如果没有环,就应该输出最原创 2013-08-25 13:58:46 · 3598 阅读 · 0 评论 -
HDU4324(强连通的Tarjan算法)
题目:Triangle LOVE 题意:给一个图,问是否存在三个点构成的环。只需求出极大连通分量,判断它的顶点是否大于等于3,如果是存在,否则不存在。#include #include #include using namespace std;const int N=2005;int head[N],low[N],dfn[N],stack[N];原创 2013-07-10 20:29:58 · 1953 阅读 · 0 评论 -
POJ2594(二分匹配+Floyd求传递闭包)
题目:Treasure Exploration 很明显是最小路径覆盖,只是必须先要求传递闭包就行了。#include #include #define N 510int uN,vN;int g[N][N];int linker[N];bool used[N];bool DFS(int u){ int v; for(v=0;原创 2013-03-09 20:39:49 · 2140 阅读 · 1 评论 -
HDU2255(带权二分图的最大匹配)
题目:奔小康赚大钱 KM算法深入理解:请戳这里 #include #include #define INF 99999999#define N 350int n,nx,ny; //nx,ny分别表示x集合和y集合的元素个数int lx[N];int ly[N];int link[N];int slack[N];int visx[N];原创 2013-03-09 20:15:52 · 2615 阅读 · 0 评论 -
二分匹配的Hopcroft-Carp算法
题目:HDU2063 过山车 果然Hopcroft-Carp算法快,用匈牙利算法15ms,而Hopcorft-Carp却0ms。因为匈牙利算法的时间复杂度为O(n*e),而Hopcroft-Carp算法O(sqrt(n)*e)本算法适合处理大一点的数据。。。。。。 #include #include #include #include const int N原创 2013-03-09 21:10:23 · 3205 阅读 · 0 评论 -
(HDU4324)判断一个图中是否存在两点的出度相同
本问题很简单,对于图中我们先用一个数组统计每个点的出度大小,然后排序,然后就可以看是否存在相邻的两个数组值是否相等就行了。#include #include #include #include using namespace std;const int N=2500;int out[N];char str[N][N];int main(){原创 2013-07-10 14:29:43 · 1621 阅读 · 0 评论 -
POJ1734(floyd求最小环的路径)
题目:Sightseeing trip 题意:求一个图中最小环,输出路径。#include #include #include using namespace std;const int N=105;const int INF=9999999;int map[N][N],dist[N][N];int road[N][N],path[N];in原创 2013-07-10 16:16:21 · 2992 阅读 · 0 评论 -
HDU4307(最小割)
题目:Matrix 之所以能够用最大流解决这个问题,关键在于最大流可以求解下面这个函数的最小值:接下来就分析一下如何用最大流求解上面这个函数的极值。首先xi一共只有两种选择,那么最终可以按xi的取值将xi划分成两个集合,那么如果xi在值为1的集合里,xj在值为0的集合里,那么就会产生一个代价cij。同时如果xi选择0就会产生一个bi的代价,如果xi选择1就会产生一个ai的代原创 2013-05-29 12:14:19 · 1654 阅读 · 0 评论 -
HDU3549(最大流算法的Dinic算法)
题目:Flow Problem#include #include #include using namespace std;const int N=2050; //N表示点的数量const int M=2500000; //M表示边的数量,注意应大于(N-1)*N,因为网络是双向的const int INF=0x7fffffff;int e;原创 2013-05-03 19:09:52 · 1460 阅读 · 0 评论 -
hdu3549(网络流入门题-最大流的Ford-Fulkerson算法)
题目:Flow Problem 网络流深入学习请戳这里。Ford-Fulkerson方法依赖于三种重要思想,这三个思想就是:残留网络,增广路径和割。Ford-Fulkerson方法是一种迭代的方法。开始时,对所有的u,v∈V有f(u,v)=0,即初始状态时流的值为0。在每次迭代中,可通过寻找一条“增广路径”来增加流值。增广路径可以看成是从源点s到汇点t之间的一条路径,沿该路径可原创 2013-03-13 19:44:33 · 4609 阅读 · 2 评论