![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
文章平均质量分 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 · 2806 阅读 · 0 评论 -
POJ 2513 Colored Sticks(Trie+并查集+欧拉回路)
//TRIE + 并查集 + 欧拉回路 //A了这道题,学会了用并查集判断无向图的连通性 #include #include #include using 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 · 793 阅读 · 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 · 1079 阅读 · 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 · 1075 阅读 · 0 评论 -
POJ 1502 MPI Maelstrom(单源最短路|Dijkstra实现)
//单源最短路。最后答案应该处从起点到其他结点最短路中的最大值。 #include #include using 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 · 1114 阅读 · 0 评论 -
Sicily 1210 二叉树(树的遍历)
//树的遍历 //几个结论 //1:前序遍历第一个元素是根,后序遍历最后一个元素是根 //2:前序遍历第二个元素是某子树的根,但左右不确定 //3:在后序遍历中找到前序遍历的第二个元素,那么以这个元素为基准,可以划分新的左右子树 //4:当前序遍历的第二个元素出现在后序遍历的倒数第二位,以后序遍历倒数第三位起向左数都是子树的元素,但是左右不确定,因此有2种情况 //递归处理 + 乘法原理 #include #include using namespace std; int ans; c原创 2010-07-31 19:55:00 · 2195 阅读 · 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 · 1179 阅读 · 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 · 1163 阅读 · 0 评论 -
Sicily 1823 Hardest Job Ever!(单源最短路)
//单源最短路径 //Dijkstra + 优先队列实现 #include #include #include #define INF 1200000000 #define MAXN 205 #define MAXM 20005 using 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 · 1298 阅读 · 0 评论 -
POJ 2421 Constructing Roads(最小生成树)
//最小生成树 //只需将已经建成的路的边权值置零即可 //然后对边进行排序,建立并查集,用Kruscal #include #include #include #define MAX 105 using 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 · 737 阅读 · 0 评论 -
Sicily 1424 奖金(拓扑排序)
//拓扑排序,若a员工工资比b员工多,那么从b->a建立有向边 //接着从工资应该最小的员工开始逐步向工资最大的员工叠加 //注意对DAG环的判断 //注意因为结点数高达10000,因此必须用邻接表储存 #include #include #include #include using namespace std; const int MAX = 10005; vector e[MAX];//用vector储存临界表 int cost[MAX];//每个结点的工资 int inDeg原创 2010-06-07 09:55:00 · 3412 阅读 · 0 评论 -
POJ 1094 Sorting It All Out(拓扑排序)
//拓扑排序。每添一条边就进行一次拓扑排序 #include #include #include using 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 · 728 阅读 · 0 评论 -
Sicily 1140 国王的遗产(搜索|图论)
<br />//搜索,暴力 //这题卡了我几天,检查到最后,居然是我的minID维护错误!我艹!这种错误居然卡了我几天!!!我就是一个超级无敌大水人! //不过卡了这几天也好,程序也经过不断优化 //做法是预处理出以每个结点为根的子树有多少个结点cnt,以每个结点为根的子树最小编号minID //接着枚举所有边,暴力找出每个可行方案 //在搜寻每一个可行方案,都以编号最小的结点作为根,这一个优化方案,可以省去搜索比较上下两部分的最小编号值 //这题有几个重要结论是需要证明的 //1、在树中仅存原创 2011-03-23 16:40:00 · 5336 阅读 · 2 评论 -
ZOJ 3362 Beer Problem(最小费用流)
//最裸的最小费用流 #include #include using 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 · 903 阅读 · 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 · 1536 阅读 · 1 评论 -
POJ 2135 Farm Tour(最小费用流)
//最小费用流 //构图关键是添加超级源点,超级汇点 //题意是要找一条可以再终点往返的路,这2条路距离之和最短且每条路只能经过一次 //第一步将问题转化为找2条从起点到终点 //第二步与费用流挂钩,将距离当做费用,将容量设置为1是为了保证每条路只经过一次 //超级源点和起点的容量为2,终点和超级汇点容量为2,使得最多找2条路 //最终的mincost即为答案 //注意双向边这个条件,当出现双向边或多重边时,就得用邻接表储存了 #include #include using namesp原创 2010-08-17 01:34:00 · 862 阅读 · 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 · 1457 阅读 · 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 · 2446 阅读 · 2 评论 -
POJ 2195 Going Home(KM算法——二分图最小权匹配)
//最小权匹配(KM算法) #include #include #include using 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 · 918 阅读 · 0 评论 -
POJ 2455 Secret Milking Machine(二分答案+最大流)
感谢怀哥提供的经典好题,让我学会了二分答案这个思想!//二分答案+最大流 //终于见识到传说中的二分答案这个方法了 //如果没有二分答案这个提示,这道题我怎么也不会往最大流去想 //思路是这样的,将所有边权值排序,记录边权值的上界和下界 //接着开始二分答案,依照枚举的这个答案构图,即将边权值最大值小于等于枚举的这个答案的边加进图中 //(双向边)并将他们的容量设为1,有多重边就将容量再+1,接着FF最大流,如果最大流>=T,则说明答案是满足条件的 //记住此时未必是正确答案,答案还可以再小。继原创 2010-08-15 02:16:00 · 1648 阅读 · 1 评论 -
POJ 2263 Heavy Cargo(图的遍历)
//图的遍历 //CITY记录到当前城市的的最大运载量 //状态转移方程,city[y] = max(city[y],min(r[x->y],city[x]); #include #include #include #include using 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 · 975 阅读 · 0 评论 -
POJ 3159 Candies(差分约束系统)
//差分约束系统 //建立关系十分简单,SPFA求到终点的距离 //但这一题十分奇怪,用队列就TLE,用栈就不会,真奇怪~ #include #include #define MAXN 30005 #define MAXM 150000 #define INF 1000000000 using 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 · 770 阅读 · 0 评论 -
POJ 3259 Wormholes(判断负权回路|SPFA||Bellman-Ford)
//判断是否存在负权回路SPFA算法 #include #include #define MAXN 505 #define MAXM 6000 #define INF 1000000000 using 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 · 1407 阅读 · 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 · 683 阅读 · 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 · 2730 阅读 · 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 · 2981 阅读 · 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 #include usin原创 2010-07-08 13:01:00 · 992 阅读 · 0 评论 -
POJ 1087 A Plug for UNIX(网络流—最大流(最大二分匹配))
//网络流——通过构图用最大流来作做大匹配 //将用电器(device)与源点相连 //插座(plug)和汇点相连 //适配器与插座相连,且权值为INF //将最大匹配问题构图转化为最大流问题,再用汇点总流减去最大流得到答案 #include #include #include #include #include #define INF 2000000000 using namespace std; int flow[505][505],cap[505][505]; int rfl原创 2010-07-05 15:24:00 · 1145 阅读 · 0 评论 -
POJ 1149 PIGS(网络流—最大流)
http://imlazy.ycool.com/post.2059102.html看了这篇文章才做出来的,收获很大,膜拜神牛!网络流的难点在于图的构建以及图的简化//网络流——最大流 //此题的关键是构图和对图的简化以及流量的合并 //可参见http://imlazy.ycool.com/post.2059102.html //有非常详细的讲解 #include #include #include #define INF 2000000000 using namespace std; in原创 2010-07-05 13:44:00 · 683 阅读 · 0 评论 -
POJ 1273 Drainage Ditches(网络流——最大流)
//网络流——最大流 //终止条件是——残量网络中找不到增广路 //此题还需要考虑多重边的情况 #include #include #include #define INF 2000000000 using 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 · 704 阅读 · 0 评论 -
POJ 1459 Power Network(网络流—最大流)
//网络流——最大流 //通过添加虚源点和虚汇点构图,转化为从源点到汇点的最短路 #include #include #include #define INF 2000000000 using 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 · 757 阅读 · 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 · 4147 阅读 · 2 评论 -
Sicily 1696 Flows in Grid(最大流)
//由于给定的点最高可达100*100=10000 //因此不可能建立一个10000*10000的图来描述流量,必定MLE //但考虑到是格子形状,每一个最多只与周边4个点相连 //可以通过这个性质进行图的压缩,并建立一个方向和点的转化关系 //再套用最大流模板便可通过 #include #include #include using namespace std; const int MAX = 102,INF = 2000000000; int flow[MAX*MAX][4],cap原创 2010-07-11 13:38:00 · 1024 阅读 · 1 评论 -
Sicily 1031 Campus(Dijkstra[邻接表+优先队列优化])
//Dijkstra邻接表做法//邻接表使得计算复杂度成为O(E*n),但图为稀疏图时效率比邻接矩阵高,但当图为稠密图时,E与n^2同阶,计算复杂度最坏可到O(n^3)//Dijkstra优先队列实现(相当于堆优化)//优先队列的实现的Dijstra可以使得算法在处理稠密图时速度也比使用邻接矩阵要快//原因在于插入队列的元素的前提是边关系必须满足可松弛条件,对于稠密图而言,可松弛条原创 2010-05-19 12:25:00 · 2302 阅读 · 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 · 2961 阅读 · 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 · 752 阅读 · 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 · 870 阅读 · 0 评论 -
POJ 3020 Antenna Placement(最大二分匹配)
//最大二分匹配(匈牙利算法)//这题实际上是求最小路径覆盖,但根据最小路径覆盖的定义可以将它转化为最大二分匹配//最小路径覆盖 = |V| - 最大独立集 = |V| - 最大二分匹配 (二分图中最大独立集 = 最大二分匹配)//但是在构图过程中,匹配是双向的,即 和都算匹配,因此匹配数多了1倍,所以要除以2//最后得出公式: ans = V + maxMatch/2#原创 2010-05-29 23:39:00 · 1377 阅读 · 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 · 1083 阅读 · 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 · 2150 阅读 · 0 评论