
ACM-图论
路小白_zZ
这个作者很懒,什么都没留下…
展开
-
编程之美2015初赛 质数相关(二分图匹配)
题意:一个集合内有n个点,如果一个等式中 a * b = c 中 b是质数,说明a和c质数相关否则质数无关,问这个集合的子集满足两两之间都质数无关的最大子集。题解:二分图匹配中找最大独立集,最大独立集点数 = n - 最大匹配数。#include #include #include #include using namespace std;const int N = 1005;原创 2015-04-26 11:11:28 · 723 阅读 · 0 评论 -
poj 2912(带权并查集)
题意:有n个人玩石头剪刀布的游戏,编号从1到n-1,把所有人分成3组,给每个组分配一个手势(石头、剪子、布),每轮挑出两个人出来进行游戏,这n个人里有一个裁判,他的手势是可以变化的。给出了m轮的游戏结果,a#include <cstdio>#include <cstring>#include <map>#include <algorithm>using namespace std;cons原创 2015-05-03 19:49:57 · 890 阅读 · 0 评论 -
uva 1493(并查集)
题意:一个画板上可以画4种图形,画板被分成n*m个网格,给出了每种图形的坐标大小和颜色,画了q次后,问画板上每种颜色占多少格子。 题解:因为只要最后被覆盖的颜色,所以倒着操作,这样已经画过的地方就不再计算,未画过的就并到已画的集合内,方便统计数量。#include <stdio.h>#include <algorithm>#include <string.h>#include <cmath>原创 2015-05-10 02:08:01 · 488 阅读 · 0 评论 -
poj 2492(并查集)
题意:有一个科学家提出了一个假设,一种虫子只有异性恋,而不是同性恋,然后开始实验来验证猜想,给出了n个虫子,编号从1到n,给出了q组恋爱虫子的编号,问是否验证猜想。 题解:数组倍增,给每个虫子一个异性恋的对象集合,然后每次输入的两个虫子如果不在同一个集合内,就放到对方异性恋集合内,否则无法验证猜想。#include <stdio.h>const int N = 4005;int n, q, p原创 2015-05-02 16:52:21 · 708 阅读 · 0 评论 -
poj 1733(带权并查集)
题意:有n个结点,给出了q个操作,操作是a b string表示结点a到结点b的和是奇数或偶数,输出x(前x个操作都是正确的)。 题解:带权并查集经典题,因为结点可能有10,000,000,000个,所以需要离散化,不用的点就不考虑了。因为要a加到b,如果a==b无法找到各自的根节点并判断是否要合并,所以其实是mp[a - 1]到mp[b]并入集合。另外需要注意结点是有顺序的,父亲结点要大于等于子原创 2015-05-08 23:24:59 · 1564 阅读 · 0 评论 -
poj 2236(并查集)
题意:有n个电脑坏了,编号从1到n,现在要修电脑且使电脑间能够通信,如果两台修好的电脑之间直接距离小于等于d就可以通信,如果电脑a和电脑c的距离大于d但a和c都可以与电脑b通信,那么a和c就可以通信了。O a,修好电脑a。S a b询问a和b是否能通信。 题解:每修好一台电脑,就过一遍所有电脑,把修好且能通信的电脑放到一个集合里,询问时只要判断是否在集合内就行了。#include <stdio.h原创 2015-05-02 16:02:30 · 719 阅读 · 0 评论 -
poj 1182(带权并查集)
题意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。 现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类。 第二种说法是"2 X Y",表示X吃Y。 此人对N个动物,用上述两种说法,一句接原创 2015-04-20 17:13:32 · 551 阅读 · 0 评论 -
acdream 1685(并查集)
题意:有n个人,只要消耗一个单位的能量即可完全领悟一门新的语言。如果知道了每个人会的语言,是否能让这群天才两两直接或者间接的交流呢?所谓间接得交流是指经过若干个人的翻译使两个人得到相互表达的信息。如果不能,至少需要多少能量才能实现。题解:并查集水题,先把所有人会的语言和自己放到一个集合内,然后判断所有人是否在同一个集合,如果不在同一个答案就加一。#include #include co原创 2015-04-16 14:11:46 · 559 阅读 · 0 评论 -
uvalive 3027(并查集)
题意:n个结点,有两种操作,I操作把u结点的父亲设为v,u和v距离是abs(u - v) % 1000,E操作输出u到根结点距离。题解:在输出u到根结点距离时,将路径一路加到根结点,然后压缩路径让pa[u] = root。#include #include using namespace std;const int N = 20005;int pa[N], dis[N],原创 2015-04-03 19:52:47 · 701 阅读 · 0 评论 -
uvalive 3644(并查集)
题意:要把一些化合物装箱,化合物由两种元素组成,此时一辆车上如果有n种化合物且有n种元素就会爆炸,否则不会,给出一系列要按顺序装箱的化合物,问有多少个不可以放进去。题解:并查集水题,把元素当成点,化合物当成边,如果这个图存在环就会爆炸,用并查集来检查图是否存在环,即此时两种元素是否在同一集合中。#include const int N = 100005;int pa[N];int原创 2015-04-03 19:17:59 · 698 阅读 · 0 评论 -
uva 10986(最短路径)
题意:题解:原创 2014-11-07 20:15:58 · 864 阅读 · 0 评论 -
uva 10985(最短路径)
题意:题解:原创 2014-11-20 21:57:37 · 927 阅读 · 0 评论 -
poj 1703(并查集)
题意:有n个人和两个阵营,给出两种操作,A a b ,询问a和b的是否在同一个阵营,如果有人未加入任何阵营输入不确定。D a b,让a和b成为不同阵营的。 题解:两种做法。 一种是把并查集扩大一倍,先给每个人一个假定的敌人,然后有D操作时把敌人加入到假定敌人的集合中,A操作判断a和b是否在同一个集合,如果不在判断对方是否在自己假定敌人的集合中,在就是敌人,否则是不确定。#include <std原创 2015-05-01 19:44:38 · 711 阅读 · 0 评论 -
poj 1988(并查集)
题意:有30000个木块,编号从1到30000,然后有两种操作M a b,把木块a所在的堆块放到木块b所在的堆块上,操作C a,询问木块a下面有多少个木块。 题解:用一个数组s[i]存木块i所在堆块一共有多少个木块,因为要求木块i下面有多少个木块,所以再添加一个数组dis[i]存木块i到根节点有多少个木块,这样res = s[i]-dis[i]-1。dis数组更新放在寻找根结点递归的后面,因为要先原创 2015-05-02 00:10:01 · 1404 阅读 · 1 评论 -
poj 1466(二分图匹配)
题意:给出了一些男女生的暗恋关系,保证可能发生恋爱关系的人不在一个小组内学习,问最大子集内人数是多少。 题解:二分图匹配求最大独立集。#include <stdio.h>#include <string.h>const int N = 505;int g[N][N], n, m, vis[N], link[N];bool dfs(int u) { for (int i = 0; i原创 2015-05-16 10:29:01 · 521 阅读 · 0 评论 -
poj 1719(二分图匹配)
题意:有一个r*c的网格,每列有两个白色块其他都是黑色块,一个人射箭要求在每列都射中一个白块,且所有白块都不在同一行,问是否可以做到,并输出每列射中了第几行的白块。 题解:二分图匹配,把每行的白块所在列都存起来,因为行上的白块不能共存,所以同一行白块在不同集合中。#include <stdio.h>#include <string.h>const int N = 505;int g[N][N原创 2015-05-16 10:39:50 · 563 阅读 · 0 评论 -
poj 2239(二分图匹配)
题意:有n门课,每门课都有一些上课时间,周几的第几节课,一个人想报尽量多的课但时间不能冲突,问最多能报多少门课。 题解:只需要把课程当做一个集合,上课时间当做另一个集合,然后把每个课程和它的上课时间(时间可以用(p - 1) * 12 + p表示)都加一条边到图里,找最大匹配数让每个课程至少对应一个上课时间。#include <stdio.h>#include <string.h>#inclu原创 2015-05-18 18:39:48 · 650 阅读 · 0 评论 -
poj 2536(二分图)
题意:有n个地鼠和m个地鼠洞,给出地鼠和地鼠洞的坐标,有老鹰要来抓地鼠,每只地鼠的速度都是v,且都要在s秒内进洞,每个洞最多只能进一只地鼠,问最少多少只地鼠无法生存。 题解:明显地鼠放到一个集合,地鼠洞放到一个集合,然后建图,把每只地鼠和能逃进的地鼠洞添加一条边,然后二分图找到最大匹配值,n - 最大匹配值就是解。#include <stdio.h>#include <string.h>con原创 2015-05-18 17:00:59 · 691 阅读 · 0 评论 -
hdu 5253(最小生成树)
题解:用kruskal算法,把每个点和右、下两个方向的点的边存起来,权值就是差值的绝对值,然后按升序排序,用并查集找到最小生成树。#include <stdio.h>#include <string.h>#include <algorithm>#include <cmath>using namespace std;const int N = 1005;int m, n, g[N][N],原创 2015-05-31 22:12:40 · 1163 阅读 · 0 评论 -
poj 1486(二分图必须边)
题意:有n张幻灯片重叠在一起,给出了每张矩形幻灯片在坐标系上的范围大小,然后给出了n个页码在坐标系的位置,因为幻灯片都是透明的所以无法确定页码是在哪个幻灯片上,需要判断有哪些幻灯片的页码可以确定,幻灯片给出的顺序是A…,页码给出的顺序是1…。 题解:先建图,幻灯片是一个集合,页码是另一个集合,页码a在幻灯片b内部可以连一条边,然后先进行二分图匹配找到最大匹配数,然后枚举每一条边,如果删除这条边再进原创 2015-05-18 00:37:28 · 683 阅读 · 0 评论 -
poj 1325(二分图匹配)
题意:有两台机器有各有n和m种模式(都是从0开始编号),有k个任务,每个任务可以是第一台机器的x模式或第二台机器的y模式,每台机器切换模式都要重启(重启后初始模式是0),问最少次数重启使所有任务完成。 题解:把任务当做边,两台机器的模式放在不同集合中,那么就是二分图的最小点集覆盖问题,注意模式0可以不计算,因为重启初始模式就是0,不需要花费重启次数。#include <stdio.h>#incl原创 2015-05-17 21:50:55 · 710 阅读 · 0 评论 -
poj 2771(二分图匹配)
题意:有n个人,给出每个人的身高,性别,喜欢的音乐和运动,组成一个集合要求集合内任意两个人满足下面4个不可能成为夫妻的条件之一,问集合人数最多是多少。 1.两个人身高差大于40。 2.性别不同(呵呵哒)。 3.喜欢的音乐不一样。 4.喜欢的运动一样。 题解:是一个算二分图的最大独立集的题,先把人分成两个没有交集的集合,男人和女人,然后剩下三个条件全部不满足,解 = n - 最大匹配数。#i原创 2015-05-17 21:34:56 · 607 阅读 · 0 评论 -
poj 3041(最小点覆盖)
题意:有一个n*n的网格,上面有m个小行星,一个武器一次可以摧毁一行或一列的全部小行星,问武器至少多少次能把所有小行星摧毁。 题解:这个问题可以转化为最小点覆盖问题,把每行当做一个点放入左边的集合,每列当做一个点放入右边的集合,然后每个小行星的坐标就是左右集合的一条连线,所有行星都划线最后就会有很多连线出现。最小点覆盖是指用最少的点(X集合或Y集合的都行)让每条边都至少和其中一个点关联,也就是最少原创 2015-05-16 20:58:39 · 577 阅读 · 0 评论 -
poj 3216(二分图匹配)
题意:有n个维修站,给出了一个邻接矩阵(对称阵)表示每个维修站到其他维修站的花费的时间,-1表示不可达,然后给出了m个任务,给出了每个任务要在哪个维修站进行,起始时间和任务花费时间,问至少要几个维修人员才能准时进行任务。 题解:最小路径覆盖,至少多选择多少个任务开始进行能准时进行所有任务,需要注意还需要比较间接相连和直接相连更新最小花费时间。#include <stdio.h>#include原创 2015-05-16 18:09:58 · 612 阅读 · 0 评论 -
poj 2594(最小路径覆盖)
题意:有n个点需要探索(编号从1到n),然后给出图上有那些有向边,问最少选择多少个点能遍历所有的点。注意走过的点可以重复再走。 题解:二分图求最小路径覆盖问题中点是不可以重复的,但这道题说可以重复,所以做法是可以把走过的点跳过,间接相连的点改为直接相连就可以跳过了。 特殊样例 5 4 1 2 2 3 4 2 2 5#include <stdio.h>#include <string.原创 2015-05-16 12:45:00 · 760 阅读 · 0 评论 -
poj 1422(二分图)
题意:有一个城市上有n个岔路口,m条有向路,给出了每条路能从岔路口a到岔路口b,问最少选择多少个岔路口可以走遍所有的岔路口。 题解:有向无环图的最少路径覆盖问题 = n - 最大匹配数。#include <stdio.h>#include <string.h>const int N = 125;int g[N][N], n, m, link[N], vis[N];bool dfs(int u原创 2015-05-16 11:18:19 · 510 阅读 · 0 评论 -
uva 10099(最短路径)
题意:题解:原创 2014-11-06 16:11:17 · 929 阅读 · 0 评论 -
uva 10269(最短路径)
题意:题解:#include #include #include using namespace std;const int N = 150;const int INF = 0x3f3f3f3f;int f[N][N], g[N][N], vis[N][N];int t, n, m, p, l, cnt;void spfa() { int st = n + m; qu原创 2014-11-22 20:47:20 · 1460 阅读 · 0 评论 -
uva 567(最短路径)
题意:有题解:#include #include #include using namespace std;const int N = 25;const int INF = 0x3f3f3f3f;int que, t = 1, g[N][N], num[N];void floyd() { for (int k = 1; k <= 20; k++) for (int原创 2014-11-04 19:54:43 · 834 阅读 · 0 评论 -
poj 1308(并查集)
题目:A tree is a well-known data structure that is either empty (null, void, nothing) or is a set of one or more nodes connected by directed edges between nodes satisfying the following properties.原创 2014-05-25 01:42:54 · 641 阅读 · 0 评论 -
hdu 1233(最小生成树)
题目:某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度为最小。请计算最小的公路总长度。原创 2014-06-07 22:40:43 · 614 阅读 · 0 评论 -
uva 10746(最大流最小费)
题意:有n个银行m个警察,geichu题解:#include #include #include using namespace std;const int N = 100;const int INF = 0x3f3f3f3f;int n, m, p[N];int cap[N][N], flow[N][N], maxflow;double d[N], cost[N][N],原创 2014-11-19 21:00:54 · 770 阅读 · 0 评论 -
uva 753(最大流)
题意:题解:原创 2014-11-18 21:57:59 · 757 阅读 · 0 评论 -
uva 563(最大流)
题意题解:原创 2014-11-17 21:37:06 · 708 阅读 · 0 评论 -
uva 11045(二分图匹配)
题意:题解:#include #include #include #include #include using namespace std;const int N = 40;int t, n, m, g[N][N], link[N], vis[N];map mapp;bool dfs(int u) { for (int i = 1; i <= m; i++) {原创 2014-11-15 20:30:57 · 699 阅读 · 0 评论 -
uva 10806(最大流最小费)
题意:题解:#include #include const int N = 105;const int M = 10000;const int INF = 0x3f3f3f3f;int n, m, d[N], vis[N], pa[N], q[M], g[N][N];struct Edge { int w, v, next;}e[M];int spfa(int sta原创 2014-11-15 01:05:48 · 851 阅读 · 0 评论 -
uva 10330(最大流)
题意:要yuns题解:#include #include #include using namespace std;const int N = 500;const int INF = 0x3f3f3f3f;int n, m, c[N][N], f[N][N];int vis[N], pa[N], s, t, maxflow;void ek() { queue q; m原创 2014-11-13 21:20:08 · 822 阅读 · 0 评论 -
uva 125(dp)
题意:t题解:#include #include const int N = 30;int n, g[N][N], maxx, t = 0;void floyd() { for (int k = 0; k < maxx; k++) for (int i = 0; i < maxx; i++) for (int j = 0; j < maxx; j++) if原创 2014-11-13 17:03:09 · 654 阅读 · 0 评论 -
uva 515(差分约束)
题意:题解:原创 2014-11-12 19:56:43 · 798 阅读 · 0 评论 -
fzu 2028(dfs)
题意:题解:原创 2014-11-03 23:34:57 · 670 阅读 · 0 评论