图论
文章平均质量分 51
f_zyj
一个追逐蝴蝶的人!
展开
-
NYOJ-20-吝啬的国度
描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。输入 第一行输入一个整数M表示测试数据共有M(1<=M<=5)组 每组测试数据的第一行输入一个正整数N(1<=N<=100000)和一个正整数S(1<=S<=100000),N表原创 2016-05-18 18:34:32 · 533 阅读 · 0 评论 -
NYOJ-7-街区最短路径问题
描述 一个街区有很多住户,街区的街道只能为东西、南北两种方向。住户只可以沿着街道行走。各个街道之间的间隔相等。用(x,y)来表示住户坐在的街区。例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。现在要建一个邮局,使得各个住户到邮局的距离之和最少。求现在这个邮局应该建在那个地方使得所有住户距离之和最小;输入 第一行一个整数n < 20,表示有n组测试数据,下面是n组数据; 每原创 2016-05-13 12:23:27 · 807 阅读 · 0 评论 -
HDOJ-2066-一个人的旅行
Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王子,^0^),很多事,还能丰富自己的阅历,还可以看美丽的风景……草儿想去很多地方,她想要去东京铁塔看夜景,去威尼斯看电影,去阳明山上看海芋,去纽约纯粹看雪景,去巴黎喝咖啡写信,去北京探望孟姜女……眼看寒假就快到了,这么一大段时间原创 2016-05-02 19:59:27 · 624 阅读 · 0 评论 -
第K短路
Dijkstra/* * Dijkstra变形,可以证明每个点经过的次数为小于等于K, * 所有Dijkstra的数组dist由一维变为二维,记录经过该点 * 1次、2次......k次的最小值 * 输出dist[n - 1][k]即可 */int g[1010][1010];int n, m, x;const int INF = 0x3f3f3f3f;int vis[1010];原创 2016-06-07 23:44:33 · 2604 阅读 · 1 评论 -
次小生成树
O(V^2)结论次小生成树可由最小生成树转换一条边得到证明T是某一棵最小生成树,T0是任一棵异于T的树,通过变换T0->T1->T2->…->Tn(T)变成最小生成树,所谓的变换是,每次把T_i中的某条边换成T中的一条边,而且树T_(i + 1)的权小于等于T_i的权。 具体操作是: step1. 在T_i中任取一条不在T中的边u_V; step2. 把边u_v去掉,就剩下两个连通分量A和B,原创 2016-06-08 17:33:09 · 1951 阅读 · 0 评论 -
POJ-3241-Object Clustering
曼哈顿最小生成树POJ 3241 Object Clustering曼哈顿距离 简单说,他指两点之间的横纵坐标的差的绝对值之和。题意 查找平面上的点的曼哈顿距离最小生成树的第n-k小边的长度,点数在100000以内。解析 对于曼哈顿距离的最小生成树,朴素算法需要建立n^(n - 1)条边进行kruskal算法处理,这样子做一定会TLE的。所以需要做特殊的优化,将边数优化为4 *原创 2016-06-09 20:00:52 · 1447 阅读 · 0 评论 -
DAG的深度优先搜索标记
ACM模版DAG && DFS/* * DAG(有向无环图)的深度优先搜索标记 * INIT:edge[][]邻接矩阵;pre[], post[], tag全置0 * CALL:dfsTag(i, n); pre/post:开始/结束时间 */const int V = 1010;int edge[V][V];int pre[V];int post[V];int tag;void原创 2016-06-13 02:16:41 · 1764 阅读 · 0 评论 -
图的割点、桥和双连通分支的基本概念
ACM模版[点连通度与边连通度] 在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。一个图的点连通度的定义为,最小割点集合中的顶 点数。 类似的,如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称这个点集为割边集合。一个图的边连通度的定义为,最小割边集合中的边数。[双连通图、割点与桥]原创 2016-06-13 23:31:12 · 3750 阅读 · 1 评论 -
无向图找桥
ACM模版无向图找桥/* * 无向图找桥 * INIT: edge[][]邻接矩阵;vis[],pre[],ans[],bridge置0; * CALL: dfs(0, -1, 1, n); */const int V = 1010;int bridge; //桥int edge[V][V];int ans[V];int pre[V];int vis[V];void dfs(int原创 2016-06-14 00:09:51 · 3535 阅读 · 0 评论 -
无向图连通度(割)
ACM模版无向图连通度(割)/* * INIT: edge[][]邻接矩阵;vis[],pre[],anc[],deg[]置为0; * CALL: dfs(0, -1, 1, n); * k = deg[0], deg[i] + 1(i = 1...n - 1)为删除该节点后得到的连通图个数 * 注意: 0作为根比较特殊 */const int V = 1010;int edge[V][原创 2016-06-14 23:03:40 · 2483 阅读 · 1 评论 -
最大团问题
ACM模版DP + DFS/* * INIT: g[][]邻接矩阵 * CALL: res = clique(n); */const int V = 10010;int g[V][V];int dp[V];int stk[V][V];int mx;int dfs(int n, int ns, int dep){ if (0 == ns) { if原创 2016-07-12 23:34:00 · 1318 阅读 · 0 评论 -
SPFA
ACM模版堆栈实现参考题目链接POJ 3159 Candies代码const int INF = 0x3F3F3F3F;const int V = 30001;const int E = 150001;int pnt[E], cost[E], nxt[E];int e, head[V]; int dist[V]; bool vis[V];int relax(int u, int v, int原创 2016-07-13 04:41:37 · 974 阅读 · 0 评论 -
有向图最小树形图
ACM模版有向图最小树形图/* * 有向图最小树形图 * INIT: eg置为边表;res置为0;cp[i]置为i; * CALL: dirTree(root, nv, ne); res是结果 */#define typec int // type of resconst typec V = 1010;const typec E = 10010;con原创 2016-07-17 15:24:27 · 1148 阅读 · 0 评论 -
Minimal Steiner Tree(MST)
ACM模版MST/* * Minimal Steiner Tree * G(V, E), A是V的一个子集, 求至少包含A中所有点的最小子树. * 时间复杂度:O(N^3+N*2^A*(2^A+N)) * INIT: d[][]距离矩阵; id[]置为集合A中点的标号; * CALL: steiner(int n, int a); * 给4个点对(a1,b1)...(a4原创 2016-07-17 16:00:15 · 836 阅读 · 0 评论 -
51Nod-1212-无向图最小生成树
ACM模版描述N个点M条边的无向连通图,每条边有一个权值,求该图的最小生成树。Input 第1行:2个数N,M中间用空格分隔,N为点的数量,M为边的数量。(2 <= N <= 1000, 1 <= M <= 50000) 第2 - M + 1行:每行3个数S E W,分别表示M条边的2个顶点及权值。(1 <= S, E <= N,1 <= W <= 10000)Output 输出最小生成树的所原创 2016-07-28 02:31:11 · 497 阅读 · 0 评论 -
双连通分支
ACM模版点双连通分支去掉桥,其余的连通分支就是边双连通分支了。一个有桥的连通图要变成边双连通图的话,把双连通子图 收缩为一个点,形成一颗树。需要加的边为(leaf+1)/2 (leaf 为叶子结点个数) 参考题目链接: POJ 3177 Redundant Paths 给定一个连通的无向图 G,至少要添加几条边,才能使其变为双连通图。const int MAXN = 5010; // 点原创 2016-07-17 20:47:39 · 3744 阅读 · 1 评论 -
有向图的强连通分量
ACM模版Tarian/* * Tarjan算法 * 复杂度O(N+M) */const int MAXN = 20010; // 点数const int MAXM = 50010; // 边数struct Edge{ int to, next;}edge[MAXM];int head[MAXN], tot;int Low[MAXN], DFN[MAXN], Stac原创 2016-07-17 19:31:10 · 1141 阅读 · 0 评论 -
弦图判断
ACM模版弦图判断/* * 弦图判断 * INIT: g[][]置为邻接矩阵; * CALL: mcs(n); peo(n); * 第一步: 给节点编号 mcs(n) * 设已编号的节点集合为A, 未编号的节点集合为B * 开始时A为空, B包含所有节点. * for num=n-1 downto 0 do { * 在B中找节点x, 使与x相邻的在A集合中的节原创 2016-07-18 00:46:06 · 1864 阅读 · 0 评论 -
弦图的PERFECT ELIMINATION点排列
ACM模版弦图的PERFECT ELIMINATION点排列/* * INIT: g[][]置为邻接矩阵; * CALL: cardinality(n);tag[i]为排列中第i个点的标号; */const int V = 10010;int tag[V], g[V][V], deg[V], vis[V];void cardinality(int n){ int i, j,原创 2016-07-18 01:00:47 · 1065 阅读 · 0 评论 -
稳定婚姻问题
ACM模版稳定婚姻问题/* * 稳定婚姻问题O(n^2) */const int N = 1001;struct People{ bool state; int opp, tag; int list[N]; // man使用 int priority[N]; // woman使用,有必要的话可以和list合并,以节省空间 v原创 2016-07-18 01:36:23 · 1334 阅读 · 0 评论 -
无向图连通分支
ACM模版无向图连通分支/* * 无向图连通分支(dfs/bfs邻接阵) * DFS / BFS / 并查集 * 返回分支数,id返回1.分支数的值 * 传入图的大小n和邻接阵mat,不相邻点边权0 */#define MAXN 100void search(int n, int mat[][MAXN], int* dfn, int* low, int now, int& cnt原创 2016-07-18 02:16:38 · 4305 阅读 · 0 评论 -
有向图强连通分支
ACM模版有向图强连通分支/* * 有向图强连通分支(dfs/bfs邻接阵)O(n^2) * 返回分支数,id返回1..分支数的值 * 传入图的大小n和邻接阵mat,不相邻点边权0 */#define MAXN 100int find_components(int n, int mat[][MAXN], int* id){ int ret = 0, a[MAXN], b[原创 2016-07-18 02:26:27 · 1621 阅读 · 0 评论 -
有向图最小点基
ACM模版有向图最小点基参考: 《有向图强连通分支》/* * 有向图最小点基(邻接阵)O(n^2) * 点基B满足:对于任意一个顶点Vj,一定存在B中的一个Vi,使得Vi是Vj的前代。 * 返回点基大小和点基 传入图的大小n和邻接阵mat,不相邻点边权0 需要调用强连通分支 * find_components(n, mat, id);参考《有向图强连通分支》 */#define原创 2016-07-18 02:35:40 · 1148 阅读 · 0 评论 -
2-SAT
ACM模版2-SAT/* * 2-sat 问题 * N个集团,每个集团2个人,现在要想选出尽量多的人, * 且每个集团只能选出一个人。如果两人有矛盾,他们不能同时被选中 * 问最多能选出多少人 */const int MAXN = 3010;int n, m;int g[3010][3010], ct[3010], f[3010];int x[3010], y[3010];原创 2016-07-18 12:11:04 · 1276 阅读 · 0 评论 -
51Nod-1459-迷宫游戏
ACM模版描述题解最短路径相关算法,这里使用Dijkstra算法,进行略微修改即可。默认起点是第一个结点,这里起点是Start,并且需要加上对结点权值的考虑。代码#include <iostream>#include <cstdio>#include <cstring>#define M 505#define N 505using namespace std;const int inf =原创 2016-07-30 02:27:37 · 1058 阅读 · 0 评论 -
51Nod-1640-天气晴朗的魔法
ACM模版描述题解这道题如果看清楚题意,那其实思路很容易想起来。分析题意可以得知,答案要求满足两个条件: 第一优先条件是,生成的树的最大边权必须最小; 第二优先条件是,生成树的总权值和要求最大。 分析第一个条件,我们需要使用Kruskal_0来求最小生成树,并且记录下来该种情况下,最大的边权MAXW; 接着分析第二个条件,我们顺理成章的可以想到最大生成树,但是这个最大生成树的边不能大于MAX原创 2016-08-16 23:15:49 · 902 阅读 · 2 评论 -
POJ-1985-Cow Marathon
ACM模版描述题解想要求最长两点距离,因为路径是唯一的,所以直接从任意一点查找距离此点最远的结点s,那么这个结点s一定是最远两点中的一点,然后再从这一点查找另一点,此时,求得的ans即为最远距离。这里使用两次BFS即可,结合邻接表使用。代码#include <cstring>#include <cstdio>#include <queue>#define MAXN 30010using name原创 2016-08-02 19:03:51 · 394 阅读 · 0 评论 -
51Nod-1076-2条不相交的路径
ACM模版描述题解边双连通问题,使用Tarjan算法可以KO.。代码#include <iostream>#include <algorithm>#include <cstdio>#include <vector>#include <cstring>using namespace std;const int MAXN = 5e4 + 10;int stack[MAXN]; // 每遍原创 2016-08-17 21:54:32 · 1347 阅读 · 1 评论 -
平衡二叉树
ACM模版构建平衡二叉树#define LH 1#define EH 0#define RH -1// 结点typedef struct BiTNode{ int data; int bf; struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;// 右旋void R_Rotate(BiTree *p){原创 2016-08-29 15:56:56 · 518 阅读 · 0 评论 -
邻接表
ACM模版邻接表(网)图描述:结点带权值,边带权值,有向图,属于网结构。using namespace std;// 边点结构typedef struct Edge{ int tag; int weigh; struct Edge *next;}Edge;// 表结构typedef struct Table{ int data; Edge *fi原创 2016-06-24 04:22:54 · 935 阅读 · 0 评论 -
赫夫曼编码
ACM模版赫夫曼编码mainmain.cpp#include <iostream>#include "huffman.hpp"int main(int argc, const char * argv[]){ // 源码 char S[] = "I love Golden Dream!";// char S[] = "I love FishC.com!"; //原创 2016-06-23 03:50:27 · 678 阅读 · 1 评论 -
线索二叉树
ACM模版线索二叉树typedef char ElemType;// 线索存储标志位// Link(0):表示指向左右孩子的指针// Thread(1):表示指向前驱后继的线索typedef enum {Link, Thread} PointerTag;typedef struct BiThrNode{ char data; struct BiThrNode *lchi原创 2016-06-21 21:38:56 · 602 阅读 · 0 评论 -
51Nod-1366-贫富差距
ACM模版描述题解并查集+Floyd算法~根据题意,无穷大的情况连通块儿一定超过1个,所以先用并查集过一遍,如果是一个连通块儿,那么再用Floyed算法,求任意两点之间的最短距离,默认每条路径长度为1,最后从所有距离中查找最大的距离,乘以d即为结果。代码#include <iostream>#include <cstring>#include <cstdio>using namespace st原创 2016-09-13 01:47:06 · 827 阅读 · 0 评论 -
51Nod-1445-变色DNA
ACM模版描述题解好诡异的一道题,完全跑偏了思路,一开始竟然尝试着用dfs去做,后来搞懂了题意,原来是一道最短路的变形题……用Dijkstra算法即可A之。还是我太天真了~~~代码#include <iostream>#include <cstring>#include <cstdio>using namespace std;const int INF = 0x3f3f3f3f;const i原创 2016-09-21 13:07:14 · 452 阅读 · 0 评论 -
算法马拉松18-A-染色问题
ACM模版描述题解挺有意思的一道题,一开始看到完全图,有些懵逼,想难了,仔细分析是一道找规律题。题中讲,需要两种组合一一对应,那么每种颜色出现的次数应该相等,那么只有奇数时,边数才会等于n的倍数,所以当n为偶数时,直接输出”No solution”,否则,可以按照样例的形式构造(投机取巧喽)。代码#include <iostream>using namespace std;int main(int原创 2016-09-25 12:45:43 · 468 阅读 · 0 评论 -
HDU-4081-Qin Shi Huang's National Road System
ACM模版描述题解今天第一次写次小生成树,脑子都快要炸了,写出来后测试了十几组数据(网上找了一个分AC代码进行测试对比),结果都对,对比代码部分,感觉也没有太大的差别,可是就是无法AC,无限WA,各种改,各种WA,三四个小时被这一道题给卡死了,我真的伤心透了,如果哪个大神看出来我的代码的问题了,烦请评论区告知~~~暂且Mark一下吧!!!代码#include <iostream>#include原创 2016-11-03 17:53:12 · 710 阅读 · 0 评论 -
HDU-1829-A Bug's Life
ACM模版描述题解种类并查集,相邻的两个关系如果是同性,则冲突(也就是gay),否则,正常。代码#include <stdio.h>const int MAXN = 2010;int pre[MAXN];int rank[MAXN]; // 1:同 0:异bool flag; // false:无冲突,true:有冲突void init(int n){ flag = f原创 2016-11-04 00:56:45 · 509 阅读 · 0 评论 -
HDU-1558-Segment set
ACM模版描述题解计算几何+并查集。神奇的组合……代码#include <iostream>const double eps = 1e-10;const int MAXN = 1010;struct point{ double x, y;};struct edge{ point a; point b;};int pre[MAXN];int res[MAXN];s原创 2016-11-04 01:58:40 · 459 阅读 · 0 评论 -
HDU-3461-Code Lock
ACM模版描述题解英语渣渣表示,虽然看着别人的题解知道要求26^(n-count)(count是区间个数),但是依然无法理解题意,∑q|゚Д゚|p~~~求这个区间个数很自然要用并查集,但是光这样还不够,因为n比较大,所以需要用到快速幂来求最后的结果。代码#include <stdio.h>const int MOD = 1e9 + 7;const int MAXN = 1e7 + 10;int p原创 2016-11-04 02:42:06 · 578 阅读 · 0 评论 -
最小生成树(森林)
Prim算法/* * Prim求MST * 耗费矩阵cost[][],标号从0开始,0 ~ n-1 * 返回最小生成树的权值,返回-1表示原图不连通 */const int INF = 0x3f3f3f3f;const int MAXN = 110;bool vis[MAXN];int lowc[MAXN];int Prim(int cost[][MAXN], int n) //0原创 2016-06-08 16:42:34 · 4419 阅读 · 0 评论