![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图论
文章平均质量分 75
zhengnanlee
这个作者很懒,什么都没留下…
展开
-
poj2031
最小生成树。边权=AB圆心距离-A半径-B半径。#include #include #include using namespace std;#define eps 1e-8#define zero(x) (((x)>0?(x):-(x))#define MAXN 200#define inf 1000000000原创 2013-08-12 09:49:57 · 1379 阅读 · 2 评论 -
poj1325
又见版刷题。。。本题如何构造二部图?把A的n个mode和B的m个mode看做图的顶点,然后如果某个人物可以再A的mode_i或者B的mode_j上完成,则连一个边。机器模式编号无关紧要,关键的是从不同的模式之间切换需要连线。本题求的是,最小的顶点(模式)集合,覆盖(该模式完成的任务)尽可能多的边(转换模式——减少转换模式)。上一篇日志中有一个重要的知识点,二部图的最小点覆盖数等于最大匹原创 2013-11-09 18:53:12 · 1133 阅读 · 0 评论 -
poj1062
中文题,不翻译不解释。#include #include using namespace std;const int MAX=120;int M,N,X,T,V;int map[MAX][MAX];int topo[MAX];int visted[MAX];typedef struct NODE{ int level; int price;}NODE;NO原创 2014-01-16 08:13:35 · 1436 阅读 · 0 评论 -
poj3259
用bellman搜索图的负权边。很巧妙的把物理学的负空间的概念迁移了一下,不过这过程也很自然,不怎么难想,写得很快。#include "iostream"using namespace std;#define inf 1e10int dis[1005];struct edge{ int s, e, t;}e[5200];int n, m, w_m;//numbe原创 2014-01-16 08:27:30 · 2314 阅读 · 0 评论 -
poj3687
谁知道怎么证明算法的正确性?网上都说要逆向拓扑序,不明白为什么,看人家的思路,代码很好写。#include #include #include using namespace std;#define N 210bool map[N][N];int stk[N],n,m,out[N];int main(){ int t; for(cin>>t;t--;)原创 2014-01-23 15:11:57 · 1374 阅读 · 0 评论 -
poj2983
两张图片足矣说明问题。任何形如上述约束条件的取值问题均可转化为差分约束问题。重点:约束图的建立。在Ax详细来说:G(V,E),是一个带权重的有向图,其中V={v0,v1,v2,...,vn};E={(vi,vj):xj-xi那么,1.图中自然就包含一个v0,用于保证图中至少含有一个点(下面代码的超级源点)。2.边集E包含的是每个差分约束的边,再加原创 2014-02-26 08:32:51 · 1829 阅读 · 0 评论 -
poj1275
建图规则:注意,当约束条件是>=的时候,采用最长路。如果不想敲最长路(其实就在spfa里面改一个地方。。)的话,可以把他们都同时乘以-1即可了。例如s[i-1]-s[i]>=-t[i] ==> s[i]-s[i-1] add_edge(i,i-1,t[i])。#include #include using namespace std;#define MAXN 25#原创 2014-02-26 10:18:27 · 1339 阅读 · 0 评论 -
poj1364
没有什么新意了,也没有坑点。#include #include #include using namespace std;#define inf 0x7fffffffstruct node { int to, w, next;} edge[1005];int dis[205], head[205], cnt, c[205], n, m;bool vis[205];原创 2014-02-26 10:32:20 · 1334 阅读 · 0 评论 -
poj3159
图都不用刻意建,按照“最短路”模板题做就行了。。#include #include #include using namespace std;#define MAXN 30005#define INF 9999999#define MAXE 150005typedef struct Edge { int v, w; int next;}Edge;Edge edge原创 2014-02-26 08:41:17 · 1820 阅读 · 0 评论 -
poj3422
这个题建图的时候需要拆点。每个格子都是一个点。把一个点拆成两个,两个点之间有两条路,一个容量为1,权值为那个格子的金钱数。另一条路容量为k-1,权值为0。因为走了一次钱捡起来之后就没钱了。超级源点是n*n*2, 超级汇点是n*n*2+1.#include #include #include using namespace std;#define inf 1 << 30#de原创 2014-03-13 16:52:04 · 1506 阅读 · 0 评论 -
poj2516
最小费用最大流初探。过程极为简单:把边作为边权,然后找超级源点和超级汇点之间的最短路,如果有最短路,则对它增广。http://blog.csdn.net/lin375691011/article/details/18923267这是lin的博客,讲得(网络流的概念)比较详细。这个题的细节都在代码中了,就不再叙述了。#include #include #include usi原创 2014-03-13 15:21:19 · 1544 阅读 · 0 评论 -
poj2195
跟上题变化实在是太小了,直接套用模板即可!建图都几乎如出一辙。#include #include #include #include using namespace std;#define M 1005#define inf 1 << 30int n, m;short capacity[M][M];short flow[M][M];short weight[M][M]原创 2014-03-13 16:12:22 · 1182 阅读 · 0 评论 -
poj2186
Tarjan模板题。建议采用二维vector存储。学习Tarjan时要注意两个数组:int DFN[M]; //深度优先搜索访问次序 int Low[M]; //能追溯到的最早的次序 这是学习的网址:http://www.nocow.cn/index.php/Tarjan算法P.s. Tarjan真心是递归之原创 2014-03-15 09:31:47 · 1866 阅读 · 0 评论 -
poj3352
在做2942前可以先做这个,这也是个建议。首先转载byvoid的一个关于图相关定义的介绍:[点连通度与边连通度]在一个无向连通图中,如果有一个顶点集合,删除这个顶点集合,以及这个集合中所有顶点相关联的边以后,原图变成多个连通块,就称这个点集为割点集合。一个图的点连通度的定义为,最小割点集合中的顶点数。类似的,如果有一个边集合,删除这个边集合以后,原图变成多个连通块,就称原创 2014-03-16 09:23:26 · 1741 阅读 · 1 评论 -
poj2942
处理图:将各武士看成顶点,不互相仇视的武士存在边,建立无向图。按照题目第一个要求(任意相邻的武士不能互相仇视),将武士分成若干组,每一组在图中是一个双联通分量。然后根据双连通分量性质,判断双连通分量中是否存在奇圈,如果存在,则都参加会议,反之不行。具体的方法是:1) 搜索双连通分量。深度优先搜索过程中,用一个栈保存所有经过的节点,判断割点,碰到割点就标记当前栈顶点的节点原创 2014-03-31 09:08:08 · 1762 阅读 · 1 评论 -
poj3692
仍然需要列一下定理:1.独立集:任意两点都不相连的顶点的集合 2.定理:最大独立集=顶点数-最大匹配边3.完全子图:任意两点都相连的顶点的集合(最大完全子图即最大团) 4.定理:最大团=原图补图的最大独立集=顶点数-最大匹配数(这个定理自己在纸上哗啦哗啦就出来了→_→)这题神马的最有爱了→_→幼儿园里男孩纸跟男孩纸认识,女孩纸跟女孩原创 2013-11-09 20:37:32 · 1370 阅读 · 0 评论 -
poj3020
无向二分图的最小路径覆盖 = 顶点数 – 最大二分匹配数/2,原创 2013-11-07 14:25:40 · 1438 阅读 · 0 评论 -
poj1274
做这个题是看到另一个刚关注我的童鞋博客的一篇网络流题目总结,说这个题是二分图匹配。也看了看,不难,就顺手做了做。奶牛喜欢哪个棚子就给它连上线,边权是1即可,构造二分图,求最大匹配数。#include using namespace std;#define MAXN 205#define _clr(x) memset(x,0xff,sizeof(in原创 2013-11-19 23:19:46 · 1454 阅读 · 0 评论 -
poj1556
计算几何+最短路最短路是套的模版。。= =毕竟不是自己写的。。模版上的点竟然是从0开始的。难在建图。图中,比如2和12点,其间如果没有任何线段阻挡,那么边权是他们的直线距离,如果有线段阻挡,边权是inf。枚举每两个点,用其组成的线段与其他所有线段判断,如果相交则边权inf,如果不相交距离是其直线距离。#include #include #define eps 1e原创 2013-08-02 15:51:35 · 1494 阅读 · 1 评论 -
MST(Kruskal’s Minimum Spanning Tree Algorithm)
You may refer to the main idea of MST in graph theory.http://en.wikipedia.org/wiki/Minimum_spanning_treeHere is my own interpretationWhat is Minimum Spanning Tree?原创 2013-07-09 09:15:45 · 2595 阅读 · 0 评论 -
poj1125
水!#include using namespace std;#define inf 1 int dis[105][105];int main(){ int n; while (cin >> n && n) { memset(dis, inf, sizeof(dis));原创 2013-10-26 22:12:38 · 899 阅读 · 0 评论 -
poj2253
我能说这个水到极点了么。。。2A。。第一次CE了~求最短距离,改成求最大距离。为毛我觉得图论比数学好玩多了!我这土八路慢慢得改成正规军了~#include #include #include #include using namespace std;struct point{ double x, y; }p[205];double原创 2013-10-26 21:01:03 · 814 阅读 · 0 评论 -
poj3126
我这个土八路把啸爷治得不轻。。这个题,我首先想到的不是像可以搜到的所有解题报告那样,枚举这四位,把满足“变一位”且“是素数”的所有点都放在队列里面进行搜索。说下我的思路:首先把所有的满足“变一位”且是素数的所有点,都建成图。然后要么最短路,要么搜索连通性(利用BFS特点)。搜索的过程中,由于是按照顺序(素数的大小)建图的,自然可以二分。/*有感而发*/刚才跟一个原创 2013-10-25 20:01:25 · 1391 阅读 · 0 评论 -
poj1860
貌似思路很简单?1A。。不过我一开始想的是搜索,有环这个不好判断,而且有可能会多次走环,所以搜索的“最优”性无法体现。把边权赋值为当前从a点到b点换钱之后的价格,用Bellman-Ford算法来找正环。本来bellman是用来找负环,初始化是边权无穷大,而在这里,求可以无限松弛的最大边权路径,故,把边权初始化为无穷小,以正环代表可以挣钱,负环代表赔钱。原创 2013-10-23 18:34:56 · 746 阅读 · 0 评论 -
poj1094
一个定义:对一个DAG(无环有向图)进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若 ∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。1.本题顺序:a.先判有没有环,有环就直接输出不能确定;(有两种情况,一种是,直接判断反向边,肯定就有环了,第二种情况原创 2013-10-29 21:28:54 · 1679 阅读 · 0 评论 -
poj2240
水题一枚。Floyd变形,求最大路径,如果自身到自身的权值大于1则可认为盈利。这个地方需要注意下,自身到自身的初始权值应该是1而不是0。#include #include #include using namespace std;mapint> money;double dist[35][35];void floyd(double d原创 2013-11-16 09:11:54 · 2004 阅读 · 0 评论 -
poj1459
初涉网络流。改日再写一些概念性的介绍。ek算法可作为模板使用。#include #include using namespace std;#define MAXN 105#define inf 1 bool used[MAXN];int pre[MAXN];int map[MAXN][MAXN];int vertices,原创 2013-11-17 17:04:45 · 988 阅读 · 0 评论 -
poj2485
稠密图的prim最小生成树。#include #include using namespace std;#pragma optimize( "/Ox", on ) #pragma warning(disable:4996)#define maxn 505#define typec int#define inf 0x3f3f3f3f原创 2013-11-05 09:10:46 · 923 阅读 · 0 评论 -
poj1258
跟上题就改了两行就出来了。这题标准最小生成树,即,支撑树上的总权值。#include #include using namespace std;#pragma optimize( "/Ox", on ) #pragma warning(disable:4996)#define maxn 505#define typec int#de原创 2013-11-05 09:18:17 · 864 阅读 · 0 评论 -
poj1789
仍然prim,改都不用改。边权是,字符串之间变化的字符的个数。#include #include #include #include using namespace std;#pragma optimize( "/Ox", on ) #pragma warning(disable:4996)#define maxn 2005#d原创 2013-11-05 09:47:15 · 1004 阅读 · 0 评论 -
poj3041
1。二部图: 如果图G=(V,E)的顶点集何V可分为两个集合X,Y,且满足 X∪Y = V, X∩Y=Φ,则G称为二部图;图G的边集用E(G)表示,点集用V(G)表示。(可以形象地理解为,一个图被分为两个部分2。匹配: 设M是E(G)的一个子集,如果M中任意两条边在G中均不邻接,则称M是G的一个匹配。M中的—条边的两个端点叫做在M是配对的。 3。饱和与非饱和: 若原创 2013-11-05 22:00:40 · 888 阅读 · 0 评论 -
poj1273
这是一道网络流模板题,我却10次没有A掉,其中包括2个MLE,3个RE,2个CE。今天真的不适宜敲代码。说点感想:好累!今天晚上本是集训的时间,又是回宿舍了,洗了洗衣服。白天写了两篇论文,说是论文,也就是受力分析了一下,列了个微分方程,做了个拉普拉斯变换,用simulink仿真了一下,用Matlab画了画频响图和波特图,分析了下曲线。没什么创新性可言,这种论文肯定发出去没人要,有人要也是这个杂原创 2013-11-19 23:16:05 · 1769 阅读 · 1 评论 -
poj3694
求双连通分量,利用并查集缩点,形成一棵树,树边肯定都是桥,然后每对点x,y,找原图中x,y点对应的新图中的点,如果不是一个点,则向上找它们的LCA,因为它们之间连了一条边,所以这些点到它们的LCA之间的边都不是割边了,找LCA时,先将两点上升到同一层次,然后一起再向上找父亲节点,其间遇到桥就把桥的标记删除,并且答案减1。这个题比上一个好玩多了。#include using namesp原创 2014-03-31 09:14:16 · 2641 阅读 · 1 评论