图论
文章平均质量分 75
「已注销」
SYSU
展开
-
POJ 3694 Network(割边+LCA)
<br />//Tarjan求桥 + LCA//蛋疼题目,确实想不到用LCA这个如此巧妙的方法,主要也就写下求桥,对Tarjan的DFN,LOW值再加深下理解//重点是对桥的记录,本来想通过用边来记录,后来发现这是无解的,用桥与点对应就可以了//一开始还想实践下LRJ书里面说的,缩点后形成的树每条边都是桥,后来觉得太难打了..就我这么渣的代码能力,打起来太蛋疼了- -|||#include<iostream>#include<cstdio>#include<cstring>#in原创 2011-05-05 21:14:00 · 2823 阅读 · 0 评论 -
POJ 2513 Colored Sticks(Trie+并查集+欧拉回路)
//TRIE + 并查集 + 欧拉回路//A了这道题,学会了用并查集判断无向图的连通性#include#include#includeusing namespace std;const int MAX = 500003;int N;int fa[MAX];int deg[MAX];struct trie{ int color; trie *next[26]; trie() { color = 0; memset(next,0,sizeo原创 2010-08-03 23:29:00 · 807 阅读 · 0 评论 -
POJ 2075 Tangled in Cables(最小生成树)
//最小生成树Kruscal#include#include#include#include#include#define eps 1e-8//精度处理using namespace std;int n,m;struct Edge{ int u,v; double w; Edge(int uu,int vv,double ww) { u = uu; v = vv; w = ww; }};int fa[100000];vector原创 2010-08-01 23:17:00 · 1092 阅读 · 0 评论 -
POJ 1502 MPI Maelstrom(单源最短路|Floyd实现)
//单源最短路Floyd实现。最后答案应该处从起点到其他结点最短路中的最大值。 #include #include using namespace std; const int INF = 50000000; int G[105][105]; bool flag[105]; int dis[105]; int n; int Floyd(){ for(int k = 0;k原创 2010-06-05 00:45:00 · 1089 阅读 · 0 评论 -
POJ 1502 MPI Maelstrom(单源最短路|Dijkstra实现)
//单源最短路。最后答案应该处从起点到其他结点最短路中的最大值。#include#includeusing namespace std;const int INF = 50000000;int G[105][105];bool flag[105];int dis[105];int n;int dijkstra(int st){ int res = INF*(-1); for(int i = 0;i原创 2010-06-05 00:27:00 · 1120 阅读 · 0 评论 -
Sicily 1210 二叉树(树的遍历)
//树的遍历//几个结论//1:前序遍历第一个元素是根,后序遍历最后一个元素是根//2:前序遍历第二个元素是某子树的根,但左右不确定//3:在后序遍历中找到前序遍历的第二个元素,那么以这个元素为基准,可以划分新的左右子树//4:当前序遍历的第二个元素出现在后序遍历的倒数第二位,以后序遍历倒数第三位起向左数都是子树的元素,但是左右不确定,因此有2种情况//递归处理 + 乘法原理#include#includeusing namespace std;int ans;c原创 2010-07-31 19:55:00 · 2207 阅读 · 1 评论 -
Sicily 1196 Conflict(传递闭包的建立)
//传递闭包//看了郭老的书才懂得传递闭包的建立//T为传递闭包数组//在6中运算关系中,可以简化为b ---> b=b ---> b a= a 或 b > a)那么就产生冲突 //三、对不等号的的关系另外判断,在NE(not equal)数组中NE[a][b]表示a != b//如果a != b 且 (g[a][b] = 2 或 g[b][a] = 2) 则冲突#include原创 2010-07-27 20:55:00 · 1220 阅读 · 0 评论 -
POJ 1386 Play on Words(判断欧拉回路存在)
//求欧拉回路,注意欧拉图的性质//构图的思想是以单词的首字母和末字母作为结点构图,将单词作为一条有向边//(A)----acm------>(M)-----malform---->(M)------mouse----->(E)//1、第一步是要先对图的连通性进行判断,即去掉边的方向,看图是否连通//我看了数据规模才26,我就偷懒写个Floyd水下算了//2、第二步就是根据欧拉图的性质进行判断就可以了,判断存在欧拉道路或存在欧拉回路//(1)有向图G为欧拉图(存在欧拉回路),当且仅当原创 2010-07-27 19:48:00 · 1181 阅读 · 0 评论 -
Sicily 1823 Hardest Job Ever!(单源最短路)
//单源最短路径//Dijkstra + 优先队列实现#include#include#include#define INF 1200000000#define MAXN 205#define MAXM 20005using namespace std;typedef pair dis_v;//用一个pair类型存放当前结点的距离和结点编号int T,N,M;int head[MAXN],next[MAXM],V[MAXM],W[MAXM],dis[MAXN];原创 2010-07-27 22:54:00 · 1310 阅读 · 0 评论 -
POJ 2421 Constructing Roads(最小生成树)
//最小生成树//只需将已经建成的路的边权值置零即可//然后对边进行排序,建立并查集,用Kruscal#include#include#include#define MAX 105using namespace std;int N,Q;int G[MAX][MAX];int fa[MAX];struct Edge{ int u,v,w; Edge(int uu,int vv,int ww) { u = uu; v = vv; w = ww;原创 2010-07-26 23:41:00 · 752 阅读 · 0 评论 -
Sicily 1424 奖金(拓扑排序)
//拓扑排序,若a员工工资比b员工多,那么从b->a建立有向边//接着从工资应该最小的员工开始逐步向工资最大的员工叠加//注意对DAG环的判断//注意因为结点数高达10000,因此必须用邻接表储存#include#include#include#includeusing namespace std;const int MAX = 10005;vector e[MAX];//用vector储存临界表int cost[MAX];//每个结点的工资int inDeg原创 2010-06-07 09:55:00 · 3422 阅读 · 0 评论 -
POJ 1094 Sorting It All Out(拓扑排序)
//拓扑排序。每添一条边就进行一次拓扑排序#include#include#includeusing namespace std;int inDeg[26];int n,m,time,u,v;int appear;//已出现的结点数char str[3],topo[26];bool vis[26];vector e[26];queue q;//思路://此题有个判断的优先级隐含在里面:最高级是确定排序,次之是判断图中是否存在环,最后才是无法确定排序,需要添原创 2010-06-09 08:44:00 · 738 阅读 · 0 评论 -
Sicily 1140 国王的遗产(搜索|图论)
<br />//搜索,暴力//这题卡了我几天,检查到最后,居然是我的minID维护错误!我艹!这种错误居然卡了我几天!!!我就是一个超级无敌大水人!//不过卡了这几天也好,程序也经过不断优化//做法是预处理出以每个结点为根的子树有多少个结点cnt,以每个结点为根的子树最小编号minID//接着枚举所有边,暴力找出每个可行方案//在搜寻每一个可行方案,都以编号最小的结点作为根,这一个优化方案,可以省去搜索比较上下两部分的最小编号值//这题有几个重要结论是需要证明的//1、在树中仅存原创 2011-03-23 16:40:00 · 5383 阅读 · 2 评论 -
ZOJ 3362 Beer Problem(最小费用流)
//最裸的最小费用流#include#includeusing namespace std;const int MAXN = 105;const int MAXM = 8100;const int INF = 1000000000;int mincost,maxflow;int N,M;int U[MAXM],V[MAXM],cap[MAXM],flow[MAXM],cost[MAXM],next[MAXM];int head[MAXN],pre[MAXN],Edge原创 2010-08-17 01:27:00 · 917 阅读 · 0 评论 -
POJ 2594 Treasure Exploration(传递闭包+最小路径覆盖)
//传递闭包的建立(Floyd) + 最小路径覆盖//这题有别于1422,原因在于它是一个有向图,而非DAG,机器人可以绕一圈回来在走其他路//the roads of two different robots may contain some same point.//例如1->2,2->3,3->4,4->2,2->5这一个有向图,这个图只要1个机器人就可以走完所有路,但如果不建立传递闭包//直接根据边进行匹配,那样得出来的结果是不正确的,因为平时所指的路径覆盖,顶点最多只经过一次,而这原创 2010-08-18 09:35:00 · 1551 阅读 · 1 评论 -
POJ 2135 Farm Tour(最小费用流)
//最小费用流//构图关键是添加超级源点,超级汇点//题意是要找一条可以再终点往返的路,这2条路距离之和最短且每条路只能经过一次//第一步将问题转化为找2条从起点到终点//第二步与费用流挂钩,将距离当做费用,将容量设置为1是为了保证每条路只经过一次//超级源点和起点的容量为2,终点和超级汇点容量为2,使得最多找2条路//最终的mincost即为答案//注意双向边这个条件,当出现双向边或多重边时,就得用邻接表储存了#include#includeusing namesp原创 2010-08-17 01:34:00 · 876 阅读 · 0 评论 -
POJ 3216 Repairing Company(Floyd + 二分图最大匹配)
//Floyd + 二分图最大匹配//将任务抽象为点,如果任务i完成后还能够赶上任务j的开始时间,则在i-->j连上一条边//题意是要求分配最少的维修工完成维修工作,那么最坏情况就是每个任务分配一个,共M个//但是有时多个任务能够由一个维修工完成,如果任务i和任务j之间有边相连,意味着i,j可以同时完成//那么可以减少一个维修工,这样一来,寻找最大的匹配,再用M减去最大匹配数,所得的结果就是最少的维修工数量了//前面必须用Floyd算法求出任意两点的最短距离,将-1转化为INF再处理即可原创 2010-08-18 08:23:00 · 1475 阅读 · 0 评论 -
POJ 2516 Minimum Cost(二分图最小权匹配——KM算法)
//最小权匹配(KM算法)//构图是关键,又是拆点这个思想。因为商品数量很少,最多才3,所以将一个商品拆成3个点//一开始我将K种商品全部拆出来,想一次KM解决,结果构出来的图最坏情况是50*50*3 和50*50*3 的二部图来匹配最优权值//在经过O(n^3)的KM + 多组数据,结果毫无疑问的TLE了//此题的关键是将K种商品独立出来求解,因为K种商品相互无影响//将他们独立出来分别进行K次KM算法,大大降低了时间和空间//50*3和50*3的二部图最小权匹配//复杂度是O原创 2010-08-15 02:26:00 · 2471 阅读 · 2 评论 -
POJ 2195 Going Home(KM算法——二分图最小权匹配)
//最小权匹配(KM算法)#include#include#includeusing namespace std;const int MAX = 105;const int INF = 2147483647;char G[MAX][MAX];int lx[MAX],ly[MAX],xMatch[MAX],yMatch[MAX];bool vis_x[MAX],vis_y[MAX];int W[MAX][MAX];int slack,ans,N,R,C;stru原创 2010-08-13 18:11:00 · 938 阅读 · 0 评论 -
POJ 2455 Secret Milking Machine(二分答案+最大流)
感谢怀哥提供的经典好题,让我学会了二分答案这个思想!//二分答案+最大流//终于见识到传说中的二分答案这个方法了//如果没有二分答案这个提示,这道题我怎么也不会往最大流去想//思路是这样的,将所有边权值排序,记录边权值的上界和下界//接着开始二分答案,依照枚举的这个答案构图,即将边权值最大值小于等于枚举的这个答案的边加进图中//(双向边)并将他们的容量设为1,有多重边就将容量再+1,接着FF最大流,如果最大流>=T,则说明答案是满足条件的//记住此时未必是正确答案,答案还可以再小。继原创 2010-08-15 02:16:00 · 1669 阅读 · 1 评论 -
POJ 2263 Heavy Cargo(图的遍历)
//图的遍历//CITY记录到当前城市的的最大运载量//状态转移方程,city[y] = max(city[y],min(r[x->y],city[x]);#include#include#include#includeusing namespace std;const int MAX = 205;const int MAXM = 40000;const int INF = 1000000000;int W[MAXM],V[MAXM],next[MAXM],hea原创 2010-08-06 02:46:00 · 990 阅读 · 0 评论 -
POJ 3159 Candies(差分约束系统)
//差分约束系统//建立关系十分简单,SPFA求到终点的距离//但这一题十分奇怪,用队列就TLE,用栈就不会,真奇怪~#include#include#define MAXN 30005#define MAXM 150000#define INF 1000000000using namespace std;int N,M,m,u,v,w;bool inq[MAXN];int dis[MAXN];int head[MAXN],next[MAXM],V[MAXM]原创 2010-07-26 19:35:00 · 784 阅读 · 0 评论 -
POJ 3259 Wormholes(判断负权回路|SPFA||Bellman-Ford)
//判断是否存在负权回路SPFA算法#include#include#define MAXN 505#define MAXM 6000#define INF 1000000000using namespace std;int F,N,M,WW,m,u,v,w;int head[MAXN],V[MAXM],next[MAXM],W[MAXM];bool inq[MAXN];int cnt[MAXN],dis[MAXN];void addEdge(int u,int原创 2010-07-26 19:24:00 · 1418 阅读 · 0 评论 -
POJ 1258 Agri-Net(最小生成树)
//Kruskal + 并查集#include#includeusing namespace std;int fa[101];//父亲指针数组int G[105][105];//图int n,e;//点数和边数struct edge//存放边的结构体{ int u; int v; int w;}E[5000];bool cmp(edge a,ed原创 2010-05-16 01:36:00 · 693 阅读 · 0 评论 -
Sicily 1090 Highways(Kruskal最小生成树)
//求最小生成树中的最大边//第一次写Kruskal算法,感谢JSH同学的指点//并查集的优越性,平摊后只需要O(1)的时间即可获取结果//求最小生成树时时刻注意边数和结点数是不同的,不要混淆,因为弄混了WA了3次#include#include#includeusing namespace std;int G[505][505];int n,t,_max;原创 2010-05-16 01:08:00 · 2745 阅读 · 0 评论 -
Sicily 1031 Campus(单源最短路Dijkstra)
//邻接矩阵Dijkstra,得开始学用邻接表的方式来处理单源最短路问题 可以把复杂度提高到O(ElgE)//学会了map关联容器,十分强大的类#include#include#include#include//关联容器using namespace std;const int INF = 1000000;//定义无穷,注意不能太大,否则在更新结点过程中可能产生溢出原创 2010-05-13 00:37:00 · 2993 阅读 · 1 评论 -
Sicily 1308 Dependencies among Jobs(图的搜索)
//图的搜索遍历//“We assume that there is only one job processing in one moment”即一次只能处理1个任务,不能同时处理//因此不是关键路径中的求最早启动时间,害我WA了N次!//只要记录父亲指针,不断递归加上所有父亲他们所要花的时间就好了//G++中time是关键字来的,不要随便申请time这个名字的变量……//读取数据是个麻烦的环节#include#include#include#includeusin原创 2010-07-08 13:01:00 · 1005 阅读 · 0 评论 -
POJ 1087 A Plug for UNIX(网络流—最大流(最大二分匹配))
//网络流——通过构图用最大流来作做大匹配//将用电器(device)与源点相连//插座(plug)和汇点相连//适配器与插座相连,且权值为INF//将最大匹配问题构图转化为最大流问题,再用汇点总流减去最大流得到答案#include#include#include#include#include#define INF 2000000000using namespace std;int flow[505][505],cap[505][505];int rfl原创 2010-07-05 15:24:00 · 1158 阅读 · 0 评论 -
POJ 1149 PIGS(网络流—最大流)
http://imlazy.ycool.com/post.2059102.html看了这篇文章才做出来的,收获很大,膜拜神牛!网络流的难点在于图的构建以及图的简化//网络流——最大流//此题的关键是构图和对图的简化以及流量的合并//可参见http://imlazy.ycool.com/post.2059102.html//有非常详细的讲解#include#include#include#define INF 2000000000using namespace std;in原创 2010-07-05 13:44:00 · 694 阅读 · 0 评论 -
POJ 1273 Drainage Ditches(网络流——最大流)
//网络流——最大流//终止条件是——残量网络中找不到增广路//此题还需要考虑多重边的情况#include#include#include#define INF 2000000000using namespace std;int n,m,u,v,x,y,c,st,ed;int flow[205][205],cap[205][205];//当前流量,最大容量int rflow[205],pre[205];//rflow为每个结点的残余流量,顺便当vis数组int m原创 2010-07-04 23:45:00 · 717 阅读 · 0 评论 -
POJ 1459 Power Network(网络流—最大流)
//网络流——最大流//通过添加虚源点和虚汇点构图,转化为从源点到汇点的最短路#include#include#include#define INF 2000000000using namespace std;int n,np,nc,m;int x,y,c,p,f,maxflow,st,ed,u,v;int cap[105][105],flow[105][105];int rflow[105],pre[105];int main(){ //freopen(原创 2010-07-05 01:22:00 · 767 阅读 · 0 评论 -
POJ 1062 昂贵的聘礼(最短路径Dijkstra+枚举)
//最短路径——Dijkstra算法//此题的关键在于等级限制的处理,最好的办法是采用枚举,即假设酋长等级为5,等级限制为2,那么需要枚举等级从3~5,4~6,5~7//从满足改等级范围的结点组成的子图中用Dijkstra来算出最短路径//小结,通过枚举的方式可以消除一些图与图之间的限制#include#include#define INF 200000000#defi原创 2010-03-27 13:57:00 · 4199 阅读 · 2 评论 -
Sicily 1696 Flows in Grid(最大流)
//由于给定的点最高可达100*100=10000//因此不可能建立一个10000*10000的图来描述流量,必定MLE//但考虑到是格子形状,每一个最多只与周边4个点相连//可以通过这个性质进行图的压缩,并建立一个方向和点的转化关系//再套用最大流模板便可通过#include#include#includeusing namespace std;const int MAX = 102,INF = 2000000000;int flow[MAX*MAX][4],cap原创 2010-07-11 13:38:00 · 1040 阅读 · 1 评论 -
Sicily 1031 Campus(Dijkstra[邻接表+优先队列优化])
//Dijkstra邻接表做法//邻接表使得计算复杂度成为O(E*n),但图为稀疏图时效率比邻接矩阵高,但当图为稠密图时,E与n^2同阶,计算复杂度最坏可到O(n^3)//Dijkstra优先队列实现(相当于堆优化)//优先队列的实现的Dijstra可以使得算法在处理稠密图时速度也比使用邻接矩阵要快//原因在于插入队列的元素的前提是边关系必须满足可松弛条件,对于稠密图而言,可松弛条原创 2010-05-19 12:25:00 · 2340 阅读 · 1 评论 -
POJ 1364 King(差分约束系统)
//差分约束系统//题意相当晦涩,看了好半天才大概知道个什么//对题目中给定的si,ni,ki,和一个给定的序列S[1....N]//如果(si,ni,gt,ki),意思就是存在约束条件S[si]+S[si+1]+...S[si+ni] > ki//如果(si,ni,lt,ki),意思就是存在约束条件S[si]+S[si+1]+...S[si+ni] ki//T[si+ni] - T[si-1] =或的系统,还好ki是整数,可以很容易将原创 2010-07-26 17:48:00 · 2998 阅读 · 2 评论 -
POJ 2983 Is the Information Reliable(差分约束系统)
//差分约束系统//这题比较对差分约束的构图比较直观//eg.P 3 1 4//4 == 1 --------------(4)//等价于 s5 - s4 #include#define INF 1000000000#define MAX 1005#define MAXM 210000//注意边数的数量,最坏情况2*M+1000(超级源点的边)using namespace std;int head[MAX],V[MAXM],next[MAX原创 2010-07-26 15:22:00 · 765 阅读 · 0 评论 -
POJ 3041 Asteroids(最大二分匹配)
//二分图最大匹配(匈牙利算法)//行列匹配,按照题目意思是求最小点覆盖//根据图论知识,最大匹配数等于最小点覆盖,因此将问题直接转化为二分图最大匹配来处理#include#includeusing namespace std;const int MAXN = 505;bool g[MAXN][MAXN];bool check[MAXN];//检查数组int u原创 2010-05-29 21:38:00 · 880 阅读 · 0 评论 -
POJ 3020 Antenna Placement(最大二分匹配)
//最大二分匹配(匈牙利算法)//这题实际上是求最小路径覆盖,但根据最小路径覆盖的定义可以将它转化为最大二分匹配//最小路径覆盖 = |V| - 最大独立集 = |V| - 最大二分匹配 (二分图中最大独立集 = 最大二分匹配)//但是在构图过程中,匹配是双向的,即 和都算匹配,因此匹配数多了1倍,所以要除以2//最后得出公式: ans = V + maxMatch/2#原创 2010-05-29 23:39:00 · 1386 阅读 · 0 评论 -
POJ 3169 Layout(差分约束系统)
//差分约束系统//不等式关系的建立十分直观,eg://S1和S2之间距离不能大于10//S2 - S1 = 15//构图后以1为起点,SPFA求最短路即可//如果无法到达终点N:If cows 1 and N can be arbitrarily far apart, output -2//如果存在回路: If no line-up is possible, output -1#include#include#define INF 1000000000#define原创 2010-07-26 16:18:00 · 1094 阅读 · 0 评论 -
POJ 1275 Cashier Employment(差分约束系统)
摘自冯威论文——《数与图的完美结合》设num[ i ]为i时刻能够开始工作的人数,x[ i ]为实际雇佣的人数,那么x[ I ]设r[ i ]为i时刻至少需要工作的人数,于是有如下关系: x[ I-7 ]+x[ I-6 ]+x[ I-5 ]+x[ I-4]+x[ I-3 ]+x[ I-2 ]+x[ I-1 ]+x[ I ]>=r[ I ] 设s[ I ]=x[ 1 ]+x[ 2 ]…+x[ I ],得到 0 s[ I ]-s[ I-8 ]>=r[ I ], 8 s[ 23 ]+s原创 2010-07-26 02:55:00 · 2163 阅读 · 0 评论