图论
文章平均质量分 72
SeasonJoe
这个作者很懒,什么都没留下…
展开
-
PAT1087 All Roads Lead to Rome (30)(最短路径+dfs+回溯)
题意:有N个城市,M条无向边,从某个给定的起始城市出发,前往名为ROM的城市。每个城市(除了起始城市)都有一个点权(称为幸福值),和边权(每条边所需的花费)。求从起点到ROM所需要的最少花费,并输出其路径。如果路径有多条,给出幸福值最大的那条。如果仍然不唯一,选择路径上的城市平均幸福值最大的那条路径。思路:这种题,如果简单一点,要求没那么多的情况,可以直接在dijkstra中写用dp的...原创 2018-06-19 10:27:14 · 298 阅读 · 0 评论 -
HDU3394 Railway(点双连通分量)
题意:给出一个无向图,求出它的冲突边数和多余边数,冲突边就是那些同时存在于多个环中的边,而多余边是不在任何一个环中的边.。要点:多余边很明显就是桥,我们可以推断除冲突边只能在点双连通分量中,感觉边双应该也行,主要就是求出分量后看分量中点数n和边数m的关系,如果n#include#include#include#include#includeusing namesp原创 2016-11-11 07:36:51 · 407 阅读 · 0 评论 -
有环图求环的个数和具体节点数
这个问题一直没仔细写过,cf上做到了就写一下,就是用栈存储+回溯,很简单。#include#include#include#include#includeusing namespace std;const int N = 20;vector edge[N];int s[N],top=0;//stl里的stack没办法遍历,所以用数组模拟bool instack[N];int原创 2016-12-07 19:35:31 · 5441 阅读 · 2 评论 -
codefores741A Arpa's loud Owf and Mehrdad's evil plan(图找环)
题意:对于给定的一个数列a[n],如果现在点i,那么下一个点就在a[i],现在问给定n个点,找到一个最小的t,使得对于从任意一个点x出发,经过t次之后,到达的点y, 使得点y经过t次之后会回到点x。要点:一看就是图找环,找到所有独立的环对应的节点数,对所有节点数求最小公倍数就是结果。有个地方要注意就是,当节点数是偶数时,比如1->2->3->4->1,这种情况要将节点数/2计算,因原创 2016-12-07 16:49:08 · 486 阅读 · 0 评论 -
HYSBZ2118 墨墨的等式(最短路径)
这题是校周赛上碰到的,很经典的一道题,里面的思想很巧妙。题意:中文题不解释要点:一开始根本想不到是最短路径,我们先把{an}中最小的值找到为a1,这样将所有的an%a1,这样最后的结果就是相当于x+k*a1,那么我们就要求这个x,也就是所有an%a1后组合可以达到的数。可以简单的看出x#include#include#include#include#include#i原创 2016-12-06 09:20:16 · 518 阅读 · 0 评论 -
【Dijkstra模板】codeforces715B Complete The Graph(最短路径)
struct Edge{ int from, to, dist; Edge(int u, int v, int w) :from(u), to(v), dist(w) {}};struct HeapNode{ int d, u; HeapNode(int x, int y) :d(x), u(y) {} bool operator<(const HeapNode &rhs) co原创 2016-12-03 12:20:32 · 522 阅读 · 0 评论 -
codeforces741C Arpa’s overnight party and Mehrdad’s silent entering(二分图)
题意:有2n个人围成一圈坐在桌子边上,每个人占据一个位子,对应这2n个人是n对情侣,要求情侣不能吃同一种食物,并且桌子上相邻的三个人的食物必须有两个人是不同的,只有两种食物(1或者是2),问一种可行分配方式。要点:想不出来,后来看了网上的题解豁然开朗,题目要求情侣颜色不一样所以将情侣之间连无向边,然后要求连续三个人不能一样,那就干脆连续两个人都不一样,将第2*i-1与2*i个人之间原创 2016-12-10 11:59:36 · 767 阅读 · 0 评论 -
codeforces723E One-Way Reform(欧拉通路)
第一次打线上赛,1456分来着,感觉自己模拟题做的不怎么样,总是想复杂,而且写代码慢的要死,这套题说实话还算简单,但只A了两道,其他的题都很基础,这题欧拉通路我刚好不会,所以写一下。题意:n个城市之间m条双向道路,现在把双向道路变成单向,求让出入度相同的城市最多的路线图。要点:这题就是个欧拉通路问题,因为要把双向变成单向,所以原本的出度如果是奇数,说明这个顶点的入度和出度不相等,原原创 2016-10-06 12:06:02 · 422 阅读 · 0 评论 -
POJ1270 Following Orders(拓扑排序+回溯)
题意:给出一些字母和这些字母之间的大小关系,要求输出所有满足大小的序列。要点:这题其实跟拓扑排序关系不是很大了,主要是输出所有序列比较麻烦,注意题目要求要输出所有的字母,也即是没有在大小关系中出现的字母可以插在任意位置上。我们可以这么想:所有当前入度为0的点可以作为起点,假设一个点的入度为3,说明它的前面起码有3个字母,每次dfs递归深度,寻找下一个入度为0的点,最后再回溯即可。原创 2016-09-27 20:08:14 · 580 阅读 · 0 评论 -
codeforces723F st-Spanning Tree(连通性t)
题意:给出一个n个顶点m条边的无向图,并给出两个点s,t和对应的度数,要求将图转变为一颗生成树,并且s,t的度数要满足要求。要点:生成树也就是把原图的边减少至n-1条边,并且所有的点都连通。这题的思路是将st除去的图进行连通操作,然后此时这些连通块可以分为二种:1.只和st其中一个相连2.和st两个都相连我们需要先将第一种连通块的先连在st上,因为它是必须要连的,否则没有地原创 2016-10-09 08:18:56 · 618 阅读 · 0 评论 -
POJ1149 PIGS(最大流)
题意:有m个锁着的猪圈,现在有n个顾客过来买猪,他们手里分别有对应猪圈的钥匙,如果已经开了对应的猪圈,就可以在把这个猪圈的猪赶到其他猪圈去,要求能卖出最多的猪数。要点:这题建图比较困难,建完图就是个最大流模板。另设一个源和一个汇,将顾客作为其他节点,将猪圈开启的次数作为边,这样先将源点与每个猪圈的第一个顾客连接,如果这个顾客也开了其他猪圈,将猪圈的猪数叠加,这样就构成了一个图,然后接下原创 2016-08-21 09:55:15 · 388 阅读 · 0 评论 -
HDU3749 Financial Crisis(点双连通分量+并查集)
题意:给出一个图和一系列查询,查询是给出两个点,问两点之间有多少条点不重复的路径要点:明显是点双连通,如果u,v不连通(并查集处理)输出0;如果u,v处于同一个点双连通分量,输出2(注意这里如果这个分量只有两个点一条边输出1);如果不同,输出1即可。注意这题有个地方要处理,我们知道割顶可以是好几个点双连通分量的公共点,所以如果直接用白书上的bccno数组来判断割顶处于哪个点双连通分原创 2016-11-06 10:38:01 · 501 阅读 · 0 评论 -
双连通分量
双连通分量就是无向图中的强连通分量,基本就是找割顶和桥。割顶就是一个点,如果把它取掉,连通分量数量就会增加,桥就是一条边,同理。对于一个连通图,如果任意两点至少存在两条“点不重复”的路径,也就是任意两条边都在一个简单环中,即内部无割顶,则说这个图是点双连通的。对于一个连通图,如果任意两点至少存在两条“边不重复”的路径,也就是任意边都至少在一个简单环中,即所有边都不是桥,则说这个图是边双连通原创 2016-11-06 08:51:48 · 391 阅读 · 0 评论 -
POJ2421 Constructing Roads(最小生成树)
题意:村庄之间连通,要求输出最小权值和,注意有些村庄已经连通要点:Prim算法稍微变一下,因为是求权值和,已经连通的之间权值改为0即可,反正为0后面算的时候肯定是最小值,会加入集合的,然后权值又是0不影响。15347342Seasonal2421Accepted208K32MSC++826B2016-04-03 14:36:1原创 2016-04-03 15:02:03 · 344 阅读 · 0 评论 -
PAT1021 Deepest Root (25)(树的最深节点)
题意:给出n-1条边,要求判断能否生成一棵树,并求树中所有以它为根时深度最大的节点。思路:我一开始做的时候就很莽的直接用dfs搜索,就有一个节点超时,其实简单的思考就是如果以1为根,那么就是当前最深的几个点,他们之间的距离也就是树最大的深度。可以这么理解:从1到i距离最远,那么以i为根,到1的距离已经是最远,那只要从1开始找次深的点即可。实现方法就是先dfs一遍找出最深的几个点,在用其中一个再次d...原创 2018-04-05 22:49:31 · 334 阅读 · 0 评论 -
PAT1018 Public Bike Management (30)(最短路径+DFS)
题意:每个自行车车站的最大容量为一个偶数cmax,如果一个车站里面自行车的数量恰好为cmax / 2,那么称处于完美状态。如果一个车展容量是满的或者空的,控制中心(处于结点0处)就会携带或者从路上手机一定数量的自行车前往该车站,一路上会让所有的车展沿途都达到完美。现在给出cmax,车站的数量n,问题车站sp,m条边,还有距离,求最短路径。如果最短路径有多个,求能带的最少的自行车数目的那条。如果还是...原创 2018-04-02 21:59:14 · 198 阅读 · 0 评论 -
PAT1003 Emergency (25)(dijkstra&&多条路径&&权重处理)
题意:n个城市m条路,每个城市有救援小组,所有的边的边权已知。给定起点和终点,求从起点到终点的最短路径条数以及最短路径上的救援小组数目之和。如果有多条就输出点权(城市救援小组数目)最大的那个思路:这种题用dijkstra+回溯可以保证一定做的出来。#include<bits/stdc++.h>#define inf 0x3f3f3f3fusing namespac...原创 2018-03-18 22:41:53 · 327 阅读 · 0 评论 -
POJ2446 Chessboard(二分图)
题意:一个n*m的棋盘上有t个坑,要求用1*2的纸条完全覆盖这个棋盘,纸条不能盖上坑。要点:这题是二分图,就是求二分图的最大匹配,看是否与棋盘格子数-坑数相等。但是具体的集合很难想,看了网上题解,确实比较精妙。首先我们知道如果一个格子的行数+列数i+j是奇数,它相邻的格子的i+j必定为偶数,所以我们只要用i+j为奇数的为一个集合,偶数为一个集合,求出最大匹配数即可。原创 2016-06-05 10:06:22 · 410 阅读 · 0 评论 -
HUD3488 Tour(二分图的最小权值和)
题意:给你一个有向图,边有权值,现在要你求若干个环包含所有的顶点,并且每个顶点只出现一次(除了起点),求所有环中所有边得权值之和最小值。要点:因为每个顶点只出现一次,干脆所有环都拆成起点到一个点再回起点,这样就是一个二分图的最小权值和问题。前面做的题都是求最大权值和,最小权值和就是将每条边的权值取负,其他的都不用变(除了lx的取最大值),最后输出再取负即可。原创 2016-05-13 16:43:56 · 457 阅读 · 0 评论 -
强连通分量
笔记本的独显坏了,在图书馆打的,真是痛苦。写个最基本的算法写了2个小时。神船真是半年包烂,不玩游戏还是别上船了。有向图强连通分量:在有向图G中,如果两个顶点vi,vj间(vi>vj)有一条从vi到vj的有向路径,同时还有一条从vj到vi的有向路径,则称两个顶点强连通(strongly connected)。如果有向图G的每两个顶点都强连通,称G是一个强连通图。有向图的极大强连通子图,称为强连通原创 2016-09-06 16:05:57 · 422 阅读 · 0 评论 -
POJ1236 Network of Schools(强连通分量:Tarjan算法)
题意:学校之间有网络系统,通过网络可以从一个学校定向的传递文件给另一个学校。现在问最少给几个学校传递文件使所有学校都能收到?最少添加几天网络边可以使整个网络连通?要点:就是一个基本的强连通分量,将连通分量缩成一个点,入度和出度如果都不为0说明这个点与其他点连通,所以第一问我们只要算出几个点入度为0即可,第二问我们只要算出几个点入度为0,几个点出度为0,取其中最大值即可。理解一下就是,我原创 2016-09-09 09:32:32 · 465 阅读 · 0 评论 -
UVa11324 The Largest Clique(强连通分量+DP)
题意:看白书要点:求出强连通分量后缩成点,内部点数作为权,进行DAG的DP。#include#include#include#include#includeusing namespace std;const int maxn=1010;vector g[maxn],map[maxn];int dfn[maxn],lowlink[maxn],sccno[maxn],d原创 2016-09-15 19:44:24 · 327 阅读 · 0 评论 -
codeforces732F Tourist Reform(边双连通分量)
题意:给出一个无向图,要求转变为有向图,使所有点能到达的点数的最小值最大。要点:就是一个边双连通分量,不过我没学过,看了一下白书,觉得就是无向图中的强连通分量,但是其中有很多细节有点难推敲,基本思路就是:边双连通分类对应无向图,找出其中内部点数最多的边双连通分量,它的内部所有点都可以到其余点(包括自己),其余的边双连通分量可以指向最大的这个,也就是说其他所有点的能到达点数是所有的点。最原创 2016-10-27 19:26:03 · 495 阅读 · 0 评论 -
POJ2186 Popular Cows(强连通分量)
题意:奶牛A觉得奶牛B流行,奶牛B觉得奶牛C流行,则奶牛A也觉得奶牛B流行,现在要统计被其他所有奶牛觉得流行的奶牛数量。要点:先求出强连通分量并缩成点,算出对应入度和出度,统计出度为0的奶牛数即可,一开始我是统计进度为cnt-1的,后来发现不行,因为16068699Seasonal2186Accepted1240K469MSC++1562原创 2016-09-09 11:05:06 · 455 阅读 · 0 评论 -
最小费用最大流问题
最小费用最大流就是在原来求最大流的基础上,假设每条边还有一个单位流量所需要的费用,因为最小费用的出现,原本的平行边变得有意义,并且允许反向增广,基本上就是将原本BFS改为进行一次BellmanFord算法寻找最短路径,只要初始流是该流量下的最小费用可行流,每次增广后的新流都是新流量下的最小费用流。下面POJ2135的题解:题意:从起点出发,走到终点再回到起点,每条边都对应一个时间,求所需的原创 2016-08-18 18:54:19 · 6105 阅读 · 0 评论 -
POJ1860 Currency Exchange(最短路径)
题意::有n种货币,m种兑换方式,每次兑换是这样计算的:如果一开始有V单位b货币,Rab是从a换到b的汇率,Cab是交换需要的手续费,最后能换到(V-Cab)*Rab单位b货币。一开始的货币种类是s,要求最后换回s,问能否进行一系列兑换,使最后换回s时钱增加。要点:如果能够经过一个回路返回起点使钱增加,那么可以经过无数次回路,使钱无限增多。所以就转化为bellman算法求是否有负权回路原创 2016-04-11 07:11:01 · 403 阅读 · 0 评论 -
POJ2240 Arbitrage(最短路径:SPFA||Floyd)
题意:还是套汇问题,换货币看能不能增加钱要点:还是求负权回路,这题没有规定从哪边出发,所以Floyd算法比较好,但我刚学了一下spfa算法,强行用了一下也可以。SPFA算法详解:点击打开链接SPFA算法:15380850Seasonal2240Accepted280K47MSC++1448B2016-04-12 08:原创 2016-04-12 08:52:58 · 452 阅读 · 0 评论 -
POJ3268 Silver Cow Party(最短路径)
题意:每个农场有一头牛,现在要到农场x开派对,路径是单向的,要求开完派对后还要回到原农场,求所有牛的最短路径的最大值要点:就是一个定终点求最短路径的变形,现在已经知道终点,从终点回到原农场的最短路径很好求,直接dijkstra算法即可,想求原农场到终点的最短路径只要将所有的单向路反向即可。利用函数的参量传递可以比较方便的求出。15382144Season原创 2016-04-12 14:48:55 · 483 阅读 · 0 评论 -
POJ2502 Subway(最短路径)
题意:从家到学校,给出家和学校的坐标,可以做地铁或走路,走路10KM/H,坐地铁40KM/H,地铁有很多条线路,每条线路之间有很多站点,给出每个站点的坐标(都是整数),要求到学校需要最短的分钟数(四舍五入后取整)要点:这题的输入简直日了狗了,线路的数目是以EOF结尾的,完全没办法验证数据。简单的说就是用一个map数组存储从点i到j需要的时间,然后Floyd模板即可。关键这个map数组不原创 2016-04-13 08:20:06 · 642 阅读 · 0 评论 -
POJ1062 昂贵的聘礼(最短路径)
题意:中文题要点:等级比较难处理,注意题目中是间接接触也不行,所以假如酋长等级是5,差距为2,可以交换的等级有(3,4,5),(4,5,6),(5,6,7),也即是区间长度是m,交换中最大的与最小的差为m。所以枚举等级区间,所有可行的区间dijkstra一遍,求总的最小值。还要注意这题每个点最短路径求出后要加上当前点物品价值,最后求最小。15386959原创 2016-04-13 16:40:39 · 437 阅读 · 0 评论 -
POJ3159 Candies(最短路径:SPFA+链表+栈)
题意:有n个同学分糖,给m组数据i,j,k,要求第j个同学分到的糖不能比第i个同学分到的糖多于k个。要求第1个同学与第n个同学之间糖的个数差距最大,求最大的差距。要点:这题思路不难,既然要求1~n的差距最大,那每组数据刚好取k,整个就是一个最短路问题,dis数组存储的就是最多拿到的糖。但这题时间卡的实在是太紧,SPFA用STL都会超时,而且数据太大,必须要用邻接表存储边。所以看了一下网原创 2016-04-14 16:58:28 · 595 阅读 · 0 评论 -
POJ2253 Frogger(最短路径)
题意:青蛙想从一个石子跳到另一个石子,中间有很多石子,要求青蛙跳跃距离应为路径中最大的距离,现在要求所有路径中最小的跳跃距离,就是求所有路径中最大距离的最小值。要点:可以用最短路径做,用Floyd算法,不断往里加点,只不过这次dis数组表示最大距离的最小值,而用max(map[i][k], map[k][j]))取路径中的最大跳跃距离,这种比较好理解,网上也有很多用dijkstra算法原创 2016-04-20 17:12:32 · 1209 阅读 · 1 评论 -
POJ1274 The Perfect Stall(二分图)
题意:一些奶牛只有在特定的围栏中才能产奶,要求合理安排使能产奶的奶牛数达到最大。要点:二分图裸题,最近刚学了二分图,看下面的参考博客,写的比较好:参考博客:匈牙利算法15479500Seasonal1274Accepted520K16MSC++736B2016-05-07 20:26:59#include原创 2016-05-07 20:48:21 · 415 阅读 · 0 评论 -
POJ3041 Asteroids(二分图)
题意:空间中有很多颗小行星,飞船要每次能清空同一行或同一列上的所有小行星,问最少要几次能将所有小行星清除。要点:将小行星的行作为u,列作为v建图,就是一个最小点覆盖集的裸题,最小点覆盖集=最大匹配数,直接套个模板即可。15480774Seasonal3041Accepted1164K32MSC++665B2016-05-08原创 2016-05-08 10:33:09 · 302 阅读 · 0 评论 -
POJ2239 Selecting Courses(二分图)
题意一周7天,每天12节课,现在学校有n种课程可以选择,每种课程给出对应的时间(有的课一周内有好几节),要求选的课没有时间冲突,求最大选课数。要点:知道是二分图就简单了,没有冲突不就二分图最大匹配嘛,将n节课作为u,所有时间作为v,因为数据比较小,所以建图直接用三维数组,这题如果一开始不知道是二分图估计很难办,知道了就是个裸题。15486482Seaso原创 2016-05-09 22:33:59 · 391 阅读 · 0 评论 -
POJ3259 Wormholes(最短路径)
题意;有n个农场,m条双向路,之中有w个虫洞,虫洞为单向路,从起点到终点耗时反而是负数,求能否追上自己也就是判断是否有负权回路。要点:负权回路就是回路的权值之和为负数的意思,只要出现负权回路了,无论什么算法都是求不出最短路径的。这里学习了一下bellman—ford算法,dijkstra算法虽然很好写,但是是无法处理有负权的最短路径的,而bellman—ford算法可以算出有负权的最短原创 2016-04-09 10:24:13 · 385 阅读 · 0 评论 -
POJ1502 MPI Maelstrom(最短路径)
题意:邻接矩阵表示一个无向图,因此只给一半,x代表无法从i到j。要点:最短路径水题,用dijkstra直接过了,现在主要是练习一下bellman-ford算法和spfa算法。dijkstra算法:15369258Seasonal1502Accepted208K0MSC++995B2016-04-08 20:39:57原创 2016-04-08 20:50:23 · 453 阅读 · 0 评论 -
最大流的Edmonds-Karp算法
最大流一般可以解决像货运这种问题,例如POJ1273,一共n个池塘m条边,给出每条边能通过的最大水流量,给出一个起点和一个汇点,问起点流出的最大水流量是多少。基本算法是Ford-Fulkerson算法:循环增加流的值,每次寻找一个增长路径(从起点到汇点的简单路径),每次将路径中最小的残余边量(容量减当前流量)加入流量,同时更新残余边和它的反向边,直到图中没有增长路径,此时的流即为最大流。增长路原创 2016-08-16 16:34:28 · 1097 阅读 · 0 评论 -
HDU 2255 奔小康赚大钱 (二分图:KM算法)
题意:中文题不解释要点:KM算法是求完备匹配下的最大权匹配: 在一个二分图内,左顶点为X,右顶点为Y,现对于每组左右连接X[i]Y[j]有权w[i][j],求一种匹配使得所有w[i][j]的和最大。注意完备匹配定义:|X|=|Y|=匹配数。这算法还是比较难的,证明我还是半懂不懂的,具体流程还是可以的。基本上就是利用增广路,不断修改点标,找可行边什么的。参考博客:点击打开链接这题原创 2016-05-12 15:42:19 · 372 阅读 · 0 评论 -
POJ2485 Highways(最小生成树)
题意:城市之间建高速公路,要求在能连通的情况下找出最小生成树最大的边要点:最小生成树,这题我学了一下prim算法。这个算法的要点是用点遍历,关键之处在于建立一个不断更新的low数组,这个数组记录生成树的过程中能接触到的对应最小权值。每次先随便选一个顶点作为起点,然后存入low数组,寻找一次当前权值后,集合中顶点的数目增加,能接触到的边改变,所以更新low数组。 Prim算法:...原创 2016-04-01 19:44:12 · 422 阅读 · 0 评论