图论
文章平均质量分 72
AC_Gibson
这个作者很懒,什么都没留下…
展开
-
HDU5441 Travel 并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5441题目大意:n个顶点m条边的有向图G代表n个城市和之间的m条道路,边权w代表走过该边需要的时间,每个顶点都可以休息,给出q次询问,每次询问给出一个时间限制x,问你在每次连续行走都不超过x的时间段内,最多有多少个可以到达的城市对。(u,v)和(v,u)属于不同的城市对,当且仅当u!=v.原创 2015-09-14 19:27:26 · 603 阅读 · 0 评论 -
POJ3026 Borg Maze BFS+Prime
题目大意:给出一个m×n的迷宫,迷宫中有若干(小于100)个外星人,现在Borg要同化这些外星人,Borg可以向上下左右移动,但不能碰撞到墙(即题中的“#”)。已知外星人(用“A”表示)和Borg(用“S”表示)所在位置的坐标,问你要同化所有外星人所需要的最短路线是多少。定义两点之间的距离为这两点纵坐标之差的绝对值加上这两点横坐标之差的绝对值。另外Borg可以同时向不同方向移动,此时他走的路程也是原创 2015-04-07 11:49:00 · 553 阅读 · 0 评论 -
POJ1258 Agri-Net 最小生成树
裸的最小生成树实现代码如下:#include #include #include using namespace std;#define INF 999999999#define MAX 505int map[MAX][MAX];bool s[MAX];int dist[MAX];int n;int prime(){ memset(s,false,原创 2015-04-08 21:47:33 · 415 阅读 · 0 评论 -
POJ2531 Network Saboteur DFS 或 无向图的最大割
题目大意:给你一个无向完全图,让你求出该图最大割。分析:裸的最大割问题,随机算法就行,卡好时间。实现代码如下:#include #include #include using namespace std;int maze[25][25];int main(){ int n; while(scanf("%d",&n)!=-1) {原创 2015-04-15 19:39:04 · 1138 阅读 · 0 评论 -
POJ2485 Highways 最小生成树的最大边
题目大意:n个村庄,给你这n个村庄之间权值的邻接矩阵,让你求出该图所生成的最小生成树的最大边。分析:和POJ1789一样,只需把纪录生成树权值的变量改成用来存放该生成树中的最大边即可。实现代码如下:#include #include #include #include using namespace std;#define INF 999999999原创 2015-04-07 11:35:31 · 555 阅读 · 0 评论 -
POJ1789 Truck History 最小生成树
题目大意:ACM公司给自己的运输车编号,每辆车的编号都是互不相同的7个小写字母,定义每两辆车之间的距离为:这两辆车编号上相同位置不同字母的个数,现在让你找出n辆车之间距离和的最小值。分析:典型的最小生成树问题,把n辆车以及之间的距离看做一个无向图,先找出图中各边的权值(一个循环就行),然后就是裸的Prime了。实现代码如下:#include #include原创 2015-04-07 10:55:04 · 460 阅读 · 0 评论 -
POJ1125 Stockbroker Grapevine Floyd算法
题目大意:由n位股票经纪人传播股票(编号1到n),每位股票经纪人都可以向m位同事传播(经纪人之间互为同事,但传播是单向的),传播时需花费t个时间单位(如果2号和3号都是1号经纪人的同事,1号向2号传播需要5个时间单位,向3号传播需要4个时间单位,那么1号可以在5个时间单位的时间内向2号和3号同时传播);现在告诉你每位经纪人和其同事的信息(信息包括同事的编号和传播需要的时间单位),问你想要在最短的时原创 2015-04-01 16:16:46 · 604 阅读 · 0 评论 -
POJ2253 Frogger Dijkstra & Floyd
题目大意:有两只青蛙A,B和n块石头(编号为1到n,青蛙A在1号,青蛙B在2号),已知每个石头的坐标和两只青蛙的坐标,现在让你确定青蛙的forg distance:在青蛙A到青蛙B所在石块的一条路径中,我们在该路径中每两点之间的距离中把最大值拿出来,再在所有A到B的通路中的这些最大值当中,找出最小值输出。分析:我感觉题意超难理解。。。好吧,我承认我英语太菜。对于这题呢,Di原创 2015-04-01 12:26:56 · 515 阅读 · 0 评论 -
POJ1062 昂贵的聘礼 Dijkstra算法
分析:这道题的难点在于每一条路径上都要满足等级限制,即如果等级限制为1,你和等级为3的人交换之后再和等级为2的人交换,那么你将不能再和等级为4的人交换了,因为4-2=2>1;同理你要是先和等级为4的人交换了,那么就不能和等级为2的人交换了。弄清楚了这点就没什么大问题了。实现代码如下:#include #include #include using namespace std;原创 2015-03-31 21:41:56 · 587 阅读 · 0 评论 -
POJ1860 Currency Exchange 反向bellman-ford
题目大意:在一个城市中存在n中货币,编号1到n,货币之间可以进行兑换,两种货币之间的兑换率为r,兑换时的手续费为c,这就意味着,假如你有100美元想要兑换成卢布,美元和卢布之间的兑换率为29.75,手续费为0.39的话,你能得到(100-0.39)*29.75=2963.3975卢布。现在已知n种货币和m中货币之间的兑换关系,每个兑换关系包括:可以相互兑换的两种货币a和b,以及货币a对b的兑换率r原创 2015-03-31 16:25:54 · 559 阅读 · 0 评论 -
图的遍历:BFS和DFS
先来看图的深度优先遍历: 深度优先遍历的基本思想是访问顶点V0,然后访问V0邻接到的未被访问的顶点V1,再从V1出发递归地按照深度优先的方式遍历。当遇到一个所有邻接于它的顶点都被访问过了的顶点u时,则回到自己访问顶点序列中最后一个拥有未被访问相邻顶点的顶点w,从w出发继续访问。最终当任何已被访问过的顶点都没有未被访问的相邻顶点时,遍历结束。也就是说,深度优先遍历是沿着图的某一条分原创 2015-03-10 15:37:40 · 680 阅读 · 0 评论 -
POJ3259 Wormholes 最短路判负环
题目大意:FJ有n块农场,编号为1到n,这n块农场由m条道路和w个虫洞连接,没条道路是双向的,权值为t1,表示经过每条道路需要花费t1个时间单位,每个虫洞是单向的,权值为t2,经过每个虫洞可以让你回到t2个时间单位之前(说白了就是时光倒流);现在问你,FJ想从1号农场开始,经过若干农场后,在其出发之前的某一时刻回到1号农场。现在问你能否实现。分析:我们把虫洞上的权值看成负的,这原创 2015-03-29 18:09:14 · 564 阅读 · 0 评论 -
HDU2094 产生冠军 拓扑排序
题目大意:输入一些选手之间的比赛结果,问你是否能确定出冠军。很明显,冠军只有一个,我们可以对于每一组输入结果,把它存入一个图的邻接矩阵中,然后遍历入度为0的顶点即可,如果入度为0的顶点只有一个,那么很显然,该顶点对应的选手就是冠军,如果入度为0的顶点有多个,那么就表明这些人直接没有 比出胜负,冠军就无法产生。本题的难点就在于输入字符串与数字编码之间的对应,这点就STL中的map很容易就可以原创 2015-02-13 08:52:47 · 1277 阅读 · 0 评论 -
POJ1094 Sorting It All Out 拓扑排序
题目大意:给你n个大写字母(从A开始往后数n-1个)和m组字母之间的关系(X(1)k组关系后(k(2)k组关系后(k(3)m组关系后若仍不能判断n个字母之间的关系,那么就输出否。分析:很明显的拓扑排序,但我们要先明确这3个输出的优先级:(2)的优先级最高,其次是(1),(3)的优先级最低。原因很简单,首先(1)(2)不一定需要遍历这m组关系,而且我们在找出正确关系的原创 2015-04-09 21:06:09 · 443 阅读 · 0 评论 -
单源最短路径:bellman-ford算法和SPFA算法
前面讲了单源最短路径的Dijkstra算法和任意两点间最短路径的Floyd算法,今天我们来看一下求单源最短路径的另外两种常用的算法:bellman-ford算法和SPFA算法。至于为什么要把这两个放在一起呢,比较SPFA算法是对bellman-ford算法的改进和优化。 我们先来看一下bellman-ford算法:其实bellman-ford算法和Dijkstra算法是有相似之处原创 2015-03-29 17:22:16 · 1067 阅读 · 0 评论 -
hihoCoder1097 1098 1109:最小生成树
hihoCoder1097:最小生成树一:Prime算法题目链接:http://hihocoder.com/problemset/problem/1097分析:Prime算法用的是土的邻接矩阵,这在图中顶点数比较小的时候是挺有效的。实现代码如下:#include #include #include #define MAX 1005#define INF 999999原创 2015-04-28 16:05:47 · 617 阅读 · 0 评论 -
HDU5438 Ponds 拓扑+并查集
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5438题目大意:n个顶点m条边的无向图,每个顶点有一个权值,现在要删除所有的叶子节点,重复此操作直至形成的“森林”中不存在叶子节点,然后找出森林中顶点个数为奇数的树的权值的和。分析:删除操作可以模拟拓扑过程,首先我们让度数为1的顶点进队,然后每出队一个顶点,就让该顶点相邻顶点的度原创 2015-09-14 13:13:56 · 1605 阅读 · 0 评论 -
POJ2337 Catenyms 欧拉路径
题目链接:http://poj.org/problem?id=2337题目大意:给出n个单词,找出他们之间一条字典序最小的连接路径。两个单词能连接当且仅当前一个单词的尾字母等于后一个单词的首字母。分析:单词接龙,POJ1386的升级,需要输出路径。我们可以先把这些单词排序,然后在进行建图,这样我们在dfs的时候就等于直接按字典序来搜索了。实现代码如下:#in原创 2015-08-21 11:03:55 · 419 阅读 · 0 评论 -
POJ2230 Watchcow 欧拉回路路径
题目链接:http://poj.org/problem?id=2230题目大意:相当于给出一个有向图,求出一条欧拉回路,并输出路径。分析:题中说是每条路都正反走两边,其实就是相当于就是连接两个顶点的一个双向路径,每个方向的路径都走一遍。实现代码如下:#include #include using namespace std;const int M=50原创 2015-08-19 17:22:35 · 482 阅读 · 0 评论 -
POJ1386 Play on Words 欧拉路径
题目链接:http://poj.org/problem?id=1386题目大意:给你n个单词,判断把这些单词是否能全部连接起来。(当一个单词的首字母等于上个单词的尾字母时两个单词才能连接)。分析:对于每一个单词,我们只需要纪录下它的首字母和尾字母即可,然后单词接龙就变为了我们熟知的欧拉路径问题了。一个有向图存在欧拉路径,当且仅当该图是连通的,且所有顶点的度数之和为0,或仅存原创 2015-08-19 08:56:28 · 881 阅读 · 0 评论 -
POJ2513 Colored Sticks 欧拉路径+Tire树
题目链接:http://poj.org/problem?id=2513题目大意:有n条木棒,没条木棒两端各有一种颜色,木棒之间可以连接当且仅当连接端的颜色相同,让判断对于给出的若干木棒,能否全部连接起来。分析:以每种颜色为顶点建图,要想所有木棒都连接起来,即找出该图的一条欧拉路径。对于每种颜色,我们需要一一对应一个数字,我用map写了一个,果然TLE了,毕竟数据量还是不小的原创 2015-08-19 14:25:19 · 403 阅读 · 0 评论 -
POJ1041 John's trip 欧拉回路路径查找
题目链接:http://poj.org/problem?id=1041题目大意:一个城镇有n个二叉路口,这些路口由m条街道连接,某人想要从某个路口出发,经过所有的街道且每条街道只走一次,再回到出发点,让找出一个可行的路线,依次输出经过的街道编号,如果有多条路线,选择字典序最小的一条输出。分析:经典的欧拉回路问题。因为是要输出街道编号,建图需要一些技巧。实现代码如原创 2015-08-18 09:34:29 · 1288 阅读 · 0 评论 -
HDU3018 Ant Trip 欧拉路径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3018题目大意:n个蚂蚁村庄之间有m条道路,一群蚂蚁想要遍历所有的村庄,且每条道路只走一次,问至少需要把这群蚂蚁分成多少组才能实现目标。分析:我们假设n个村庄之间有k个连通分量,对于每一个连通分量,如果存在欧拉路径,那么该分量需要一组蚂蚁就行;如果不存在欧拉路径,我们知道,要想遍原创 2015-08-17 10:04:51 · 614 阅读 · 0 评论 -
欧拉路AND欧拉回路
定义:对于无孤立节点图G,若存在一条路经过图中每一条边且只经过一次,该条路称为欧拉路。若该路径为一个圈,则称为欧拉回路 欧拉路的判定: (1)一个无向图存在欧拉路径,当且仅当该图是连通的,且只存在零个或两个奇数度的顶点。 (2)一个有向图存在欧拉路径,当且仅当该图是连通的,且该图的所有顶点度数为0,或仅存在一个度数为1的顶点和一个度数为-1的顶点,其余点的度数原创 2015-08-15 21:06:10 · 564 阅读 · 0 评论 -
HDU4109 Instrction Arrangement 拓扑排序求关键路径
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4109题目大意:有n条指令和m条指令之间的依赖关系,对于每一组关系u v w表示指令v必须在指令u之后w执行,且执行需要w个时间单位,问你要执行n条指令最少需要消耗的时间(多条无依赖关系的指令可同时执行)分析:裸的关键路径。实现代码如下:#include #in原创 2015-08-13 12:08:52 · 725 阅读 · 0 评论 -
HDU2647 Reward 拓扑排序
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2647题目大意:有n个人m对关系,每对关系表示a的工资要比b的高,最低工资为888,问你这n个人满足m对关系的最低总工资是多少。分析:我们以这m对关系来建图,要使a的工资要比b的工资高,只需保证a到b的单向性即可。实现代码如下:#include #include原创 2015-08-11 10:38:19 · 452 阅读 · 0 评论 -
HDU1232 畅通工程 并查集求连通分量
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1232题目大意:已知n个村庄之间有若干条通路,求出使他们联通所需添加的最少道理数。分析:并查集记录已经联通的村庄集合,集合内部已经联通,m个集合之间需要添加m-1条道路来联通。实现代码如下:#include #include using namespace s原创 2015-05-22 15:31:54 · 517 阅读 · 0 评论 -
hihoCoder1081 1089 1093 :最短路径
hihoCoder1081 最短路径一题目连接:http://hihocoder.com/problemset/problem/1081分析:求单源最短路径,点集和边集都不大,邻接矩阵存储即可。Dijkstra算法实现代码如下:#include #include #define INF 999999999#define MAX 10005using name原创 2015-04-28 09:42:49 · 596 阅读 · 0 评论 -
POJ1182 食物链 并查集
并查集高级应用中文题,题目大意就不多说了。我也是看了这个帖子才AC的:http://blog.csdn.net/c0de4fun/article/details/7318642/怎么说呢,本题主要是要考虑到并查集的权值,我们假设par[ a ]=b,即b是a的父亲,我们用rank[ a ]=0来表示a和b是同一类,rank[ a ]=1来表示b可以吃a,rank[ a ]=2表示a可以原创 2015-01-05 13:51:01 · 563 阅读 · 0 评论 -
并查集基础
并查集是一种用来管理元素分组情况的数据结构,可以高效的求解等价类问题。并查集的常用操作如下:(1)查询元素a和b是否属于同一组;(2)合并元素a和b所在的组;并查集借助树来实现,与一般的树有所不同的是,我们不关注树的根结点和子节点之间的父子关系,只是把这一棵树当成一个整体来看,即一棵树中的所有结点是一个分组。我们定义par[ i ]表示元素i的所在树的根结点(需要注意的是,一颗树中的每原创 2014-12-31 10:28:34 · 542 阅读 · 0 评论 -
HDU1385 Minimum Transport Cost Floyd算法
题目大意:n个城市(编号1到n),有一批货物需要从a城市运到b城市已知城市之间道路是交通费(和城市之间距离有关),和通过每一个城市的税收(起点和终点城市不需要税收),问你从城市a到城市b的最少花费,并输出最少花费的路径。因为要输出路径,可以用Floyd算法,只需在计算dist(a,b)的时候把经过的中间城市的税收加上就行了。代码如下:#include #include #def原创 2014-12-08 20:56:18 · 452 阅读 · 0 评论 -
单源最短路径问题 Dijkstra算法
算法#define INF 999999999#define MAX 10005bool s[MAX];int dist[MAX],ans[MAX][MAX];void Dijkstra(int v,int n){ int newdist,temp,u,i,j; for(i=1;i { dist[i]=ans[v][i];原创 2014-11-12 14:07:29 · 575 阅读 · 0 评论 -
最短路径Floyd算法
前面我们介绍了单源最短路径问题的Dijkstra算法,Dijkstra算法虽然有比较好看的复杂度,但其对于有负权值的图来将,就显得力不从心了,下面我们来介绍另一种更为广泛的最短路径问题的解法:Floyd算法Floyd算法(弗洛伊德)算法的原理基于动态规划,比如要找出1到k这些点中从a到b的最短路径(dist(a,b)),我们把从a到b所经过的路径分为两部分,经过某一点x,和必经过x点;对于经过原创 2014-12-08 13:44:23 · 679 阅读 · 0 评论 -
最小生成树
最小生成树是指带权图中连接图中所有顶点的权值最小的生成树。这里有两种比较大众化的算法:Prime算法和kruskal算法我们先来介绍一下Prime算法,Prime算法的核心是贪心,先把图某一顶点加入点集V中,然后开始遍历与该点集中的点相邻的边中的权值最小的边所相连的点,再把这点加入点集V中,直至点集V包含图中的所有顶点为止,可以看出,他的复杂度是O(n^2)代码如下:#includ原创 2014-12-29 20:23:31 · 529 阅读 · 0 评论 -
POJ1679 The Unique MST 次小生成树
次小生成树次小生成树可由最小生成树换一条边得到。其生成过程:#include #include #include using namespace std;const int N=1005;const int INF=1<<30;bool vis[N],used[N][N];int dist[N],pre[N];int map[N][N],medge[N]原创 2015-01-27 23:11:15 · 469 阅读 · 0 评论 -
POJ2236 Wireless Network 并查集
题目大意:输入n和d,n代表标号为1到n的电脑,下面n行每行是一台电脑的坐标,每两台电脑只有相距不超过d时才算相连,然后给出若干组操作,每一组操作表示维修电脑x或者询问x和y是否相连,让判断对于每次询问的结果。用并查集纪录每一次维修后可以相连的电脑,然后对于每一次询问,我们只需判断x和y是否有相同的根结点即可。#include #include #include using n原创 2015-01-06 19:28:52 · 535 阅读 · 0 评论 -
HDU3790 最短路径问题 Dijkstra算法
单源最短路径问题题目大意:有编号为1到n的城市,和m条道路,每条道路有距离和价钱,求从起始点到终点的最短距离,如果最短距离有多条,求出花费最少的那条路径,输出最短距离和花费的价格。Dijkstra算法,只需在求最短路径时把花费纪录一下就行了,当有多条最短路径时找出最低价格。#include #include #include #define MAX 1010#defin原创 2014-12-01 12:31:36 · 771 阅读 · 0 评论 -
POJ1703 POJ2492 并查集
并查集应用:说白了,这题就是简化版的食物链。和食物链的思想一样,我们用a和a+N表示a在哪个集合,这样,对于输入的D a b,我们只需合并a和b+N所在的集合即可。#include #include #include using namespace std;#define MAX 100005int par[2*MAX],rank[2*MAX],s[MAX];v原创 2015-01-05 19:12:11 · 570 阅读 · 0 评论 -
HDU2066 一个人的旅行 单源最短路径
#include #include #define MAX 1010#define INF 999999999using namespace std;bool s[MAX];int ans[MAX][MAX],dist[MAX];void Dijkstra(int n,int v){ int i,j,u,temp; for(i=1;i原创 2014-11-21 15:17:34 · 600 阅读 · 0 评论 -
HDU2680 Choose the best route 单源最短路径
单源最短路径。和HDU2066差不多,原创 2014-11-21 16:19:29 · 609 阅读 · 0 评论