![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
ACM之图论
文章平均质量分 77
黎嫣
人总要有个梦想,万一实现了呢?
展开
-
nysit 203 最短路+dp
<br />题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=203<br />题目大意:有n+1座城池,小白在第0座城池里,其他城池从1到n编号并且每座城池拥有一些财富,这些城池间有m条道路,现在小白想要拥有这些财富,需要攻打占有就可以了,但是派武将攻打时,需要消耗粮食,但粮食有限,问小白最多能够拥有的财富<br />思路:先求各点到0的最短路,然后用01背包问题求最大财富<br />#include<stdio.h> #include<stri原创 2011-05-14 17:57:00 · 461 阅读 · 0 评论 -
hdu 1301 prim算法
<br />题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1301<br />题目大意:多年前在村庄间修建了一些路,好多是冗余的,加大了路的负担,现在要减少一些路,只剩余下一些主大道,使村庄间直接或间接可达就行,求路最小的负担。<br />思路:要使村庄间可达,n个村庄只需n-1条路就行,故为最小生成树的问题,用prim算法解决,要注意的是对输入格式的处理,将大写字母转换成数字表示村庄就可以了<br />#include<stdio.h> #include<原创 2011-05-03 21:00:00 · 742 阅读 · 0 评论 -
hdu 1162 prim算法
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1162题目大意:图纸上有一些点,要用通过墨水用直线将它们连在一起,求用最少的墨水时所连的长度思路:典型的最小生成树问题,只是要调用函数自己计算这些点之间的距离#include #include #define N 105 #define Initmax 1005 double a[N][N],lowcost[N],x[N],y[N]; int s[N],n; double dist(double x原创 2011-05-03 19:55:00 · 509 阅读 · 0 评论 -
poj 2312 广搜+优先队列 (nysit 284)
题目链接:http://poj.org/problem?id=2312题目大意:坦克大战,一个n*m的矩阵,给定起始位置和目标位置,中间有empty spaces, rivers, steel walls and brick walls ,其中rivers, steel walls 不可通过,brick walls可以射击之后再通过,empty spaces可以直接通过,求到达目标位置所需的最短时间思路:很明显是广搜,但由于刚开始没有想起用优先队列,故超时,后看网上说用优先队列,才改正AC了#include原创 2011-05-14 19:59:00 · 567 阅读 · 0 评论 -
poj 3114 强连通分量 + 最短路
题目链接:http://poj.org/problem?id=3114题目大意:战争期间的通信问题,同一个国家的城市间可以互相通信,距离可视为零,不同国家的城市间根据所给路径,求解最短路我的思路:强连通分量 + 最短路,先将属于同一个连通分支(属于同一个国家)的城市缩点,然后对新图求最短路#include #include #include #define MAX 510 #define Initmax 999999999 using namespace std; int n,g[MAX]原创 2011-05-05 21:47:00 · 481 阅读 · 0 评论 -
poj 2553 tarjan算法
<br /> 题目链接:http://poj.org/problem?id=2553题意描述:给定图,让求其中的sinks,即输出这样一些点,如果可以从这个点u到达图中的另一个点v,则一定也存在路径可以从点v到达u,那么u就是满足条件的sinks,排序后输出这些点就ok了思路:用tarjan算法,先求图中的强连通分支,缩点,如果一个连通分支的出度为0,则这个连通分支中的所有点都满足条件,输出即可(如果一个连通分支中有一个点可以到达该连通分支以外的点,则该连通分支中的所有点都不满足条件)注意:刚开始用了邻接矩原创 2011-04-28 16:09:00 · 825 阅读 · 0 评论 -
zzuli 1480 欧拉图
题目链接:http://acm.zzuli.edu.cn/showproblem?problem_id=1480题意:判断一个图是否存在欧拉回路思路:如果一个图存在欧拉回路,则图中所有点均为偶点且是连通图,先判断是否有奇点,然后判断是否连通#include #include int G[105][105],f[105],p[105]; struct road{ int a,b; }s[2005]; int count,n,m; void dfs(int v) { int i; fo原创 2011-05-06 22:19:00 · 429 阅读 · 0 评论 -
nysit 239 二分图最大匹配
<br />题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=239<br />题目大意:月老准备给n个女孩与n个男孩牵红线,成就一对对美好的姻缘。现在,由于一些原因,部分男孩与女孩可能结成幸福的一家,部分可能不会结成幸福的家庭。现在已知哪些男孩与哪些女孩如果结婚的话,可以结成幸福的家庭,月老准备促成尽可能多的幸福家庭,请你帮他找出最多可能促成的幸福家庭数量吧。<br />思路:即女孩作为一个顶点集,男孩作为一个顶点集,可以结成幸福家庭的男孩女孩之间原创 2011-05-17 08:39:00 · 490 阅读 · 0 评论 -
poj 3041 匈牙利算法
<br />题目链接:http://poj.org/problem?id=3041<br />题目大意:贝西要乘飞船经过一个分布着小行星的矩形空间,为了把所有小行星击毙,她的武器只能一次击中在同一行或同一列上的所有行星,为了使武器花费最小,求至少要射击多少次才能使所有小行星都消失。<br />思路:对asteroids标记为1,其余标记为0,那么问题就是对一个01矩阵,选择若干行和列,可以覆盖所有的1,可以这样建二分图:以行号为左节点,列号为右节点,i行j列为1,那么i和j有条边,那么问题就是从左边和右边选原创 2011-05-12 08:58:00 · 751 阅读 · 0 评论 -
poj 2195 KM算法(完备匹配)
题目链接:http://poj.org/problem?id=2195题目大意:在n*m的矩阵中,有一些man和house,数目相等,要使每个man都回到一个house里,所走的距离为对应位置的行号差和列号差之和,求所需走的最小距离并输出思路:很明显是二分图最小权值匹配问题,由于KM算法求的是最大权值匹配,故要将权值取负,然后用KM模板即可,最后结果再取反输出对于KM算法,我还是处于懵懂状态,需要继续理解#include #include #include #define N 110 #define原创 2011-05-12 20:39:00 · 780 阅读 · 0 评论 -
nysit 38 Krustra算法
<br />题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=38<br />题目大意:有n个教学楼,现要连接通电线路,给出连接某些点的花费,然后给出各点接线到外界供电设施所需要的费用,并且要求只能有一个点连接到外部供电设施,求使所有楼都通电的最小花费<br />思路:由于题意说明数据保证至少存在一种方案满足要求,故这n个教学楼肯定能够互相连通,然后问题就是求最小生成树的问题,最后再加上连接外部设备所需的最小花费即为结果<br />#include<原创 2011-05-15 15:58:00 · 465 阅读 · 0 评论 -
poj1789 prim算法
<br />题目链接:http://poj.org/problem?id=1789<br />题目大意:现有不同的卡车种类,除最初的第一种外,其他的都是有别的继承而来,它们都有各自的代码,每个代码都唯一的表示一种卡车,两种卡车的距离是代码中不同字符的个数,派生计划的质量取决于所有派生关系间的距离,距离和越小,计划质量越高,求最高质量<br />思路:求出任意两种卡车间的距离,然后求一棵最小生成树,则距离和最小<br />#include<stdio.h> #include<string.h> #defi原创 2011-05-05 22:32:00 · 518 阅读 · 0 评论 -
poj 1258 prim算法
<br />题目链接:http://poj.org/problem?id=1258<br />题目大意:给你n个农场及它们间的距离,求把所有农场联系起来的最短距离<br />思路:所有点连通的最小花费,及最小生成树<br />#include<stdio.h> #include<string.h> #define Max 1000000 #define N 5000 int n,Isin[N]; __int64 dis[N][N],d[N],sum; //结果可能很大,要定义成64位 void原创 2011-05-05 22:18:00 · 457 阅读 · 0 评论 -
hdu 1102 最小生成树 prim算法+Kruskal算法(并查集)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1102题目大意:给定n个村庄,及各村庄间修路的费用,求要使各村庄连通的最小费用,要注意的是,有些村庄间已经有路,就不需要再修了,处理时,只要把已有路的村庄间距离修改为0就可以了prim算法:#include #define N 105 #define Initmax 1005 int a[N][N],lowcost[N],s[N],n; int prim() { int i,j,u,Max,sum=原创 2011-05-03 17:42:00 · 891 阅读 · 0 评论 -
nysit 42 欧拉通路(一笔画图)
<br />题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=42<br />题目大意:给你一些点和边,问能否用一笔把这个图画出来,每条边只能画一次<br />思路:求是否存在欧拉通路(所有点度数均为偶数或者有两个点的度数为奇数),图可能不连通,故还要判断图的连通性,另外,需要注意的是图中可能存在孤立的点,这个也要判断<br />#include<stdio.h> #include<string.h> #define N 1010 int d[原创 2011-05-15 15:14:00 · 1704 阅读 · 0 评论 -
hdu 1116 并查集
<br />题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1116<br />题目大意:给你一连串单词,看能否进行单词接龙,是这些单词形成一条链<br />思路:将每一个单词的首尾字母当做结点,首尾字母间连线,判断最后形成的有向图能否形成欧拉通路,用并查集<br /> 欧拉通路:除首尾结点外,其余结点入度等于出度,起点出度减入度等于1,终点入度减出度等于1<br /> 欧拉回路:所有结点的入度都等于出度<br />#include<stdi原创 2011-05-03 22:15:00 · 414 阅读 · 0 评论 -
poj 1094 拓扑排序
题目链接:http://poj.org/problem?id=1094题目大意:给你一些大写字母间的偏序关系,然后让你判断能否唯一确定它们之间的关系,或者所给关系是矛盾的,或者到最后也不能确定它们之间的关系。思路:拓扑排序,看能否根据所给关系对它们进行拓扑排序(看网上有些思路是这样的:每次读入一对关后,做一次floyd, 计算传递闭包.然后判环,其实很简单,就是看有没有点i的map[i][i]=1;有就证明有环!如果有环就矛盾了。如果无环再判断是否能确定关系,(注意每次都把出入度数组清零!)计算每个点的出度原创 2011-05-16 20:45:00 · 622 阅读 · 0 评论 -
poj 3020 匈牙利算法
题目链接:http://poj.org/problem?id=3020题目大意:现有四种天线,每种都只能覆盖东西南北中的一个方向上相邻的两点,现给你一个矩阵,上面分布着需要天线覆盖的点,让求最少需要多少个天线才能覆盖所有点。思路:以'*'为顶点,四个方向相邻的'*'之间建边,由于一条匹配边的两个顶点在计算匹配数时重复计算了,故最后真正的匹配数应该是算出的最大匹配数除以2,需要注意的是这里计算的最大匹配数是指最大匹配的顶点数,而不是边数(这个纠结了好长时间)最少需要天线数= 最大匹配数/2+未匹配数= 最大匹原创 2011-05-12 09:40:00 · 496 阅读 · 0 评论 -
poj 1236 强连通图 tarjan算法
题目链接:http://poj.org/problem?id=1236题目大意:各学校之间有单向的网络。如果 A—>B 则如果 A 得到一个软件则可以给学校B,在这样一个有向图中,有两个问题。1, 至少要向多少个学校提供软件,可使所有学校都得到软件。2,至少需要几条边,才能使向任一个学校提供软件,都能使所有学校都得到软件,即使得该图变为一个强连通图。思路:用Tarjan算法可以计算出强连通分量的个数。在此基础上,缩点(就是把一个强连通分量看成一个点),计算每个缩点的入度和出度。缩点入度为0的个数就是第一问的原创 2011-04-28 13:55:00 · 830 阅读 · 0 评论 -
poj 3662 最短路+优先队列+二分法
题目链接:http://poj.org/problem?id=3662题目大意:一个无向图有n个点,p条边,边上有权值,现要把1和n连接起来,但最多提供k条边免费,花费取路径中其余的边中最大权值,求所需的最小花费。即要求选择若干条边构成顶点1到顶点n的一条路径, 使得路径上边权最大值(不包括免费边)最小.思路:假设A是可行解,即路径上边权最大值为A,则该路径上边权大于A的边一定小于等于K条。若A不是最优解,那么必然B于是我们可以二分答案,得到一个值X,将所有小于等于X的边变为0,大于X的边变为1。做最短路,原创 2011-05-14 15:55:00 · 765 阅读 · 0 评论 -
nysit 115 Dijkstra算法
<br />题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=115<br />题目大意:南将军统领着N个部队,这N个部队分别驻扎在N个不同的城市。他在用这N个部队维护着M个城市的治安,这M个城市分别编号从1到M。现在,第K号城市发生了暴乱,南将军从各个部队都派遣了一个分队沿最近路去往暴乱城市平乱。已知在任意两个城市之间的路行军所需的时间,请你编写一个程序来告诉南将军第一个分队到达叛乱城市所需的时间。注意,两个城市之间可能不只一条路。<br />思路原创 2011-05-14 18:50:00 · 1108 阅读 · 0 评论 -
hdu 1546 Dijkstra变形
<br />题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1546<br />题目大意:现要进行单词接龙,要求前一个单词的最后四个字符和后一个单词的前四个字符相同,给你一串单词,并给出由当前单词找到下一个单词所需花费的时间,然后求由第一个单词找到最后一个单词所需的最短时间<br />思路:最短路,如果一个单词的最后四个字符和下一个单词的前四个字符相同,则在两个单词间连一条有向边,边的权值为第一个单词所需的花费时间,则转换为了图,求第一个单词到最后一个单词的最短原创 2011-05-20 15:57:00 · 870 阅读 · 0 评论 -
hdu 1217 floyd算法
<br />题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1217<br />题目大意:给你n种货币,以及它们之间的兑换关系,即汇率,求能否通过兑换将一种货币增值<br />思路:将兑换关系转换为图,将货币间的汇率转换为边的权值,但不是求最短路,是求两点间距离是否大于1,另外,两个结点间的距离不能用权值的和,应该是积的关系,由于只要输出能否增值,对于哪种货币增值没有<br />要求,故应用floyd算法,求所有结点间的距离。<br />#include<std原创 2011-05-05 12:41:00 · 552 阅读 · 0 评论 -
nyist 247 spfa算法
<br />题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=247<br />题目大意:梦幻国有N个城市和M条道路,每条道路连接某两个城市。任意两个城市之间最多只有一条道路直接相连。这M条道路中有一部分为单向通行的道路,一部分为双向通行的道路。同一种商品在不同城市的价格不一定相同。但是,同一种商品在同一个城市的买入价和卖出价始终是相同的。虚拟城市之旅,允许你在旅游的同时,利用 X 商品在不同城市中的差价赚回一点旅费,但最多只能交易一次。即,在某个城原创 2011-05-06 22:31:00 · 386 阅读 · 0 评论 -
poj 3259 bellman-ford算法
<br />题目链接:http://poj.org/problem?id=3259<br />题目大意:农场上有一些普通的道路(双向)和虫洞(单向),其中虫洞具有时光倒流的作用,问能否从一个点开始经过一些路和虫洞,最终回到这个点时,回到开始时间之前<br />思路:将虫洞的权值设为负,对每个点用bellman-ford算法进行松弛,判断该点是否能产生负权的距离,如果有一个能,则停止,若最终完成时,都不能,则不能<br />#include<stdio.h> #define max 10000 #defi原创 2011-05-06 22:51:00 · 1240 阅读 · 1 评论 -
hdu 1245 最短路
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1245题目大意:有一个100*100的中心在原点的长方形湖,中间有一个直径为15的圆形陆地,湖中有一些点,可视为陆地,问从中间的陆地上,在不超过最大步长的情况下,若能到达湖外,求所需的最小步数及最短步长思路:最短路的变形#include #include #include #define MAX 150 struct node{ int x,y; }point[103]; int n,s[103]原创 2011-05-05 21:43:00 · 860 阅读 · 0 评论 -
poj 1860 spfa算法
<br />题目链接:http://poj.org/problem?id=1860<br />题目大意:给你一种货币,及其最初的价值,然后给你几种货币间的兑换关系,问能否通过兑换最终使这种货币增值<br />思路:用spfa算法判断是否能增值<br />#include<stdio.h> #include<string.h> #include<queue> using namespace std; #define N 105 #define eps 1e-6 int IsIn[N],Count[原创 2011-05-06 22:37:00 · 1045 阅读 · 0 评论 -
poj 1062 Dijkstrul算法
题目链接:http://poj.org/problem?id=1062题目大意:一个探险家为了要娶酋长的女儿,必须用一定的金钱和某种物品去换,而物品的拥有者也要用一定的金钱和另外的物品来换取,换取条件是交换者之间的等级不能直接或间接的大于某个数,现在要求探险家娶到酋长女儿能够用到的最小的金钱数思路:若两种物品间可以用某种转换关系,则用有向边连接,边的权值即为交换的费用,然后在给定的等级交换范围内,求所需的最小金钱注意:每个物品为一个节点。酋长所要物品为源节点。求源节点到其它节点的最短路径。结果是到所有节点最原创 2011-05-07 20:01:00 · 569 阅读 · 0 评论 -
poj 1125 floyd算法
<br />题目链接:http://poj.org/problem?id=1125<br />题目大意:股市中要通过市场传播一些谣言(信息),这些传播者之间有一定的关系网,股票经纪人们都只相信一些可信任来源的信息,为了使一个信息传播到所有人,求使所有人都接收到信息的最小时间。<br />思路:将关系网转换为有向图,两点间的传播时间为权值,然后求每个顶点为起点到所有顶点中的最长路径,然后求所有顶点最长路径的最小值,具有最小值的起点即为传播起始位置。<br /> #include<stdio.h> #defi原创 2011-05-11 11:28:00 · 461 阅读 · 0 评论 -
poj 3660 floyd算法(传递闭包)
<br />题目链接:http://poj.org/problem?id=3660<br />题目大意:有n头牛比赛,m种比赛结果,最后问你一共有多少头牛的排名被确定了,其中如果a战胜b,b战胜c,则也可以说a战胜c,即可以传递胜负。求能确定排名的牛的数目<br />思路:如果一头牛的被x头牛打败,打败y头牛,且x+y=n-1,则我们容易知道这头牛的排名就被确定了,所以我们只要将任何两头牛的胜负关系确定了,在遍历所有牛判断一下是否满足x+y=n-1,将满足这个条件的牛数目加起来就是所求解。抽象为简单的flo原创 2011-05-16 20:36:00 · 592 阅读 · 0 评论 -
poj 2253 最短路
题目链接:http://poj.org/problem?id=2253题目大意:青蛙要从一个石头跳到另一个石头上,要求跳的路线中最大跳(即某条路线中最远的那一步)的最小值,起始位置在第一个点,目的位置在第二个点,中间点在紧接着的输入思路:(1)用floyd算法,求所有点之间的最大跳的最小值,最后输出a[0][1],即起始与终止位置的最小值,采用传递闭包的思路,时间复杂度较高,但代码简单(2)Dijkstru的变形,即求两点间的最短距离,只是最短距离的求法有变,当前加入一个点时,松弛方法不同,时间复杂度降低了原创 2011-05-06 21:57:00 · 2131 阅读 · 1 评论 -
hdu 1150 匈牙利算法
<br />题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150<br />题目大意:机器调度问题,有两台机器,分别有n和m种工作状态,现有k个任务,需要用这两种机器来完成,由于每更换一次机器的工作状态都需要重启,因此,想要怎样安排这些任务,使得机器的重启次数最少<br />思路:由于每个任务都可以用A或B机器的某种工作状态来完成,因此,对于每个任务,可以把A,B的工作状态作为顶点,在对应的A和B的工作状态间连线,则对于每条边的两个顶点,因为每个任务都要完成原创 2011-05-13 15:57:00 · 754 阅读 · 0 评论 -
nysit 20 广搜
<br />题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=20<br />题目大意:在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来。现在,Tom在第S号城市,他有张该国地图,他想知道如果自己要去参观第T号城市,必须经过的前一个城市是几号城市(假设你不走重复的路)。 <br />思路:即将这棵无根树变为以顶点S为根的树,然后输出每个节点的直接父节点。直接从S开始广搜,搜到的点修改其父节点,而S的父节点为-1即可<br原创 2011-05-15 11:21:00 · 589 阅读 · 0 评论 -
poj 1904 强连通图
题目链接:http://poj.org/problem?id=1904题目意思:有n个女生和n个男生,给定一些关系表示男生喜欢女生(即两个人可以结婚),再给定一个初始匹配,表示这个男生和哪个女生结婚,初始匹配必定是合法的.求每个男生可以和哪几个女生可以结婚且能与所有人不发生冲突。思路:将男生从1到n编号,女生从(n+1)到2*n编号,输入时如果男生u可以和女生v结婚,那么就做一条从u到v的边(u,v),对于输入的初始匹配(u,v)(表示男生u和女生v结婚),那么从v做一条到u的边(v,u),然后求解图的强连原创 2011-04-29 22:26:00 · 1075 阅读 · 0 评论 -
poj 2186 tarjan算法
题目链接:http://poj.org/problem?id=2186题目大意:有n个牛,m组关系,每组关系表示前面的牛崇拜后面的牛,让求有多少牛被所有的牛崇拜思路:可以先用tarjan算法将图求强连通分支,然后缩点,求每个点的出度和出度为0的个数num,如果num>1,则说明图中出度为0的点大于等于2,又由于缩点后的图中不可能存在环(与连通分支不符),故出度为0的点不可以互相到达,即图不连通,则输出0(没有牛被所有牛崇拜),如果num=1,则说明图中只有一个出度为0的点,则该点(连通分支)所含顶点的个数即原创 2011-04-29 07:27:00 · 804 阅读 · 0 评论 -
poj 2060 二分匹配
<br />题目链接:http://poj.org/problem?id=2060<br />题目大意:出租车安排问题,现出租车公司接到一批订单,每个订单有个起始时间,起始位置,终止位置,出租车完成一个订单后,需要停一分钟才能进行下一个订单,先要求出租车公司最少要派多少出租车才能完成这批任务<br />思路:如果一个出租车完成一个任务后,能够在下一个任务要求时间之前赶到下一个任务的起始位置,则在两个任务间连一条有向边,表示两个任务能够公用一辆出租车,最后即求最小路径覆盖问题,用最少的路径使得每个顶点都被覆盖原创 2011-05-20 16:43:00 · 952 阅读 · 0 评论