
ACM之图论
文章平均质量分 50
noname40
这个作者很懒,什么都没留下…
展开
-
poj1125 最短路floyd
题意:股票经纪人传递消息,消息可以同时传播,输入传递信息的人数,然后每一行开头输入一个t,随后有t对数k h,代表了这个股票经纪人把消息传播给k需要的时间是h.求让哪个股票经纪人传播消息,可以把消息最快传播到每一个人那里。思路:Flyod把 dist[i][j]每两个人传播消息耗费的最小时间矩阵求出来,然后每一行求出最大的时间代表了,这个人把消息传播出去所用的最大时间(至少用这么多的时间他原创 2012-01-18 10:30:46 · 451 阅读 · 0 评论 -
poj 2239 二分图 “课表”(建图方式值得借鉴)
题意:输入课程数,然后输入第几天的第几节课上这门课,最后输出这一周最多能上几门课。。思路:其实二分图本身不难,关键是怎么抽象出这种图,图左边是课程,图右边是上课时间,就是要课程和上课时间形成一种最大匹配。这道题上课时间的状态记录方法也值得借鉴下,用一个数累加,然后进行记录状态。#includeusing namespace std;int flag[8][13];bool g[310原创 2012-03-02 22:53:51 · 401 阅读 · 0 评论 -
poj 2536 二分图(坐标系中的)
题意:给出一些动物的坐标,还有他们的洞的坐标,然后给出s,v代表了s 秒之后他们就会被吃掉,他们跑的速度是v m/s,最好求最小被吃的数量思路:也就是求,动物和洞之间的最大匹配,然后N-最大匹配就是剩下被吃的动物的数量.#include#includeusing namespace std;struct point{ double x; double y;}P[105],原创 2012-03-03 07:39:51 · 408 阅读 · 0 评论 -
poj 3041 二分图最小顶点覆盖 小行星删行或列
题意:给出图上小行星的位置,每次炸一个地方,就会删去该点所在的行或者列,求最少的炸弹数。思路:就是二分图的最小顶点覆盖,小行星的位置进行建图,i--j 炸掉i 就相当于删去与i相连所以边 也就是炸掉了i行//首先熟悉一下一个著名的名词“二分图的最小点覆盖数”:假如选了一个点就相当于覆盖了以它为端点的所有的边,要覆盖所有的边至少需要几个点? #includeusing name原创 2012-03-03 22:42:50 · 1404 阅读 · 0 评论 -
poj 2226 二分图 最小顶点覆盖 “草泥马”
参考地址:http://hi.baidu.com/%BA%A3%CF%E0%C1%AC/blog/item/33dc572f55a1bf4b4fc226a7.html题意:图中的"*"代表泥泞,"."代表草,要把所以泥泞的地方全铺上板,板可以进行叠加,输出最小的板数。 一开始看着这道题目,有点儿摸不着头脑,果然像平哥跟龙哥说的那样,这道题的建图模式十分神奇。 画图原创 2012-03-03 20:57:08 · 3277 阅读 · 0 评论 -
poj 2771 二分图最大独立集 学生出游
题意:为了防止一些学生之间出现couple,老师出游要带的学生要求两两之间满足一些关系中的至少一条才可以带走。求可以带的最多的学生数量。思路:两个学生之间如果不满足其中的任何一条关系,那么就建边,最后求二分图的最大独立集,也就求出了二分图中的最多的两两之间没有关系的学生(实际是至少满足一条要求的)#include#includeusing namespace std;struc原创 2012-03-05 13:15:45 · 584 阅读 · 0 评论 -
poj 3692 二分图最大独立集 Kindergarten
题意:给出一些同学彼此了解,然后求要选出一些同学,两两之间都了解的最大数量。思路:其实也是个最大独立集问题,就是不了解才建边,求出的最大独立集也就是任意两两之间都是了解的。#includeusing namespace std;bool g[205][205];bool vis[205];int G,B;int link[205];bool dfs(int u)原创 2012-03-05 13:20:05 · 382 阅读 · 0 评论 -
poj 2446 二分图最大匹配(奇偶图)网上貌似叫(黑白染色图)
题意:要求用1*2方块完全覆盖除了坑以外的地方,求1*2方块的个数。思路:如果一个方块的i+j的和 是奇数那么它周围的四个方块,每一个i'+j'的和是偶数;反之相反。所以先把图中所以方块按照,奇数偶数的状态分成两个集合,然后把没有坑的地方的i+j的和是奇数的地方找出来,与周围四个方块(i+j和是偶数)进行建立二分图的边。所以最后求出最大匹配也就求出了1*2方块的总数,最后判断这些方块加上坑的个原创 2012-03-07 22:43:51 · 1227 阅读 · 0 评论 -
poj 3020 二分图(奇偶图) 最小路径覆盖
题意:用1*2的圈圈,把图中的'*'都圈上,圈圈之间可以重复。求最小的圈圈数思路:也是奇偶图的一个变形吧,用的二分图最小路径覆盖最小路径覆盖,最多需要的圈是"*"的个数,*ooo 输出的是1然后以奇偶图这种方式建图(网上叫黑白染色吧)每形成一个匹配,那么需要的圈的个数-1...这也就是最小路径覆盖的意义 单独一个"*"代表一个路径#include#defi原创 2012-03-07 22:49:36 · 551 阅读 · 0 评论 -
poj 2060 二分图 最小路径覆盖 出租车
题意:描述一些出租车的任务,问最少用多少个出租车可以完成所有。思路:最多用的出租车的个数是任务个数,如果一个出租车可以一次完成两个任务那么任务个数减一,这也就是二分图的最小路径覆盖问题。。关键还是在建图上,开始建图错误。。。一直WA 后来看的报告,明白了。。。还是理解题意有问题啊。。。#include#includeusing namespace std;struct node{原创 2012-03-08 22:35:15 · 718 阅读 · 0 评论 -
poj 2502 floyd 家-地铁站-学校
题意:给出家和学校的坐标,从家出发,沿途经过地铁站,一些地铁站是一条线上的,可以如果到地铁站的话,可以随便上车,步行和地铁的速度也给出,求家到学校的最短时间。注意:地铁线不一定是直的,所以只要在一条地铁线并且是相邻的两站那么就建乘地铁的边,否则就步行。思路:建图+floyd#include#include#define INF 0x7ffffffusing namespace原创 2012-02-19 17:45:30 · 723 阅读 · 0 评论 -
hdu 1285 拓扑排序(模版)
先说说拓扑排序吧,网上说的文邹邹的偏序之类的话看不懂,大致算法就是,有N个节点的有向图,每扫一次图,找出一个入度为0的点,并且剪切掉,也就是把这个点相连的边去掉,并把相连接的点的入度减一。图中不能有孤立的节点,有重边的话,入度也不累加。本题思路:给出比赛的情况,按排名输出。思路:拓扑排序,A胜B那么就A指向B。这个点被指的次数少,也就是输的场次少,也就是用拓扑排序就可以输出次序。#in原创 2012-01-18 10:43:37 · 671 阅读 · 0 评论 -
hdu 1269 tarjan
题意:中文题,就是根据给出的一些有向边,判断所有的点是不是在一个强连通里。最最基本的tarjan了,用链式前向星的加边方式。tarjan算法:tarjan#include#include#includeusing namespace std;const int maxn = 10010;const int maxm = 100010;struct edge{ int v原创 2012-08-05 18:25:39 · 459 阅读 · 0 评论 -
poj 1273 EK 最大流
要了解最大流感觉还是要啃《算法导论》,加上点程序模板基本可以搞个差不多。这是介绍网络流基础的 http://chhaj5236.blog.163.com/blog/static/1128810812009827112857794/这道题就是裸的EK了,唯一注意的是要注意重边的情况。#include#include#include#includeusing namespac原创 2012-08-10 12:45:47 · 472 阅读 · 0 评论 -
Codeforces Round #133 (Div. 2) 找奇环
B. Forming Teams题意:要平均分配两只队伍,队伍内的人不能有敌对关系,一个人最多可以和两个人敌对,如果没办法按要求分配,那么输出最小要去掉的人数。思路:因为一个人最多可以和两个人敌对,所以如果形成链或者是孤立的点都是可以分配的,如果形成偶数环,那么交错着安排也可以,只要判断奇数环就行,例如1-2 2-3 3-1 必须要去掉一个人,最后去掉后的人如果是奇数的话,那么还得去掉原创 2012-08-24 08:28:59 · 1250 阅读 · 2 评论 -
hdu 3018 一笔画问题
题意:给出一个图,求至少画几次可以把每一条边都遍历一次。思路:找连通块,如果该连通块中存在奇数度的点,那么笔数为奇数度的点 / 2 ,如果该连通块中没有奇数度的点,那么一笔可以画出,也就是存在欧拉回路。#include#include#includeusing namespace std;const int maxn = 100010;int father[maxn] , vis原创 2013-03-29 20:50:01 · 704 阅读 · 0 评论 -
欧拉回路与欧拉路
对无向图: 定义:给定无孤立结点图G,若存在一条路,经过图中每条边一次且仅仅一次,该条路称欧拉路,若存在一条回路,经过图中每边一次且仅仅一次,该回路称为欧拉回路。具有欧拉回路的图称为欧拉图,不是柏拉图。定理:无向图G具有一条欧拉路,当且仅当G是连通的,且有0个或者是两个奇数度得结点。推论:无向图G具有一条欧拉回路,当且仅当G是连通的,并且所有结点的度数均为偶数。一原创 2013-03-30 18:40:44 · 649 阅读 · 0 评论 -
图论基本知识点
转载于:http://blog.youkuaiyun.com/niushuai666/article/details/67505161.图的定义由若干个不同顶点与连接其中某些顶点的边所组成的图形就称为图。(顶点的位置以及边的曲直都是无关紧要的,而且也是没有假定这些顶点和边都要在一个平面内,只关心顶点的多少和这些变是连接哪些顶点的),通常用大写字母G表示图,V表示所有顶点的集合,E表示边的集合,记作G转载 2013-03-26 21:11:07 · 719 阅读 · 0 评论 -
poj 1486 二分图最大匹配必须边
题意:就是求点和矩形的最大匹配。如果有这种唯一的对应关系则输出,没有的话输出none思路:点和矩阵建立连接,然后求最大匹配。同时注意删边的技巧。#include#includeusing namespace std;struct point{ int x,y;}P[100];struct rec{ int minx; int miny; int maxx;原创 2012-03-03 22:26:52 · 722 阅读 · 0 评论 -
poj 1325 二分图最小顶点覆盖(机器重启)
题意:输入A、B机器的总状态和jobs的个数。机器要改变状态就要重启,求最小的重启次数使jobs全部工作。满足A状态或者B状态jobs可以工作例如输入数据5 5 100 1 11 1 22 1 33 1 44 2 15 2 26 2 37 2 48 3 39 4 300 1 1 代表 要执行0 就需要A是1或者 B是1 所以 前四个只要A都是1 那原创 2012-03-03 21:07:01 · 428 阅读 · 0 评论 -
poj 2240 floyd(货币)
题意:就是求一种货币经过兑换是否可以升值。思路:floyd,把dist[i][j]初始化为1.0,然后看是否存在dist[i][j]>1的情况(升值),把floyd函数略作修改。这道题,存在 一种情况 Usdollar 1.4 Usdollar这种情况。。。因为它,WA了好久。。#includeusing namespace std;char str[40][40];double原创 2012-01-18 10:37:34 · 399 阅读 · 0 评论 -
poj 1603 floyd
题意:这题的输入是真你妹儿的坑爹啊~ 让我调这么久。。。就是各个城镇边权都是1,最后求a to b 的最短距离dist[a][b]思路:Floyd #include#define inf 1000000using namespace std;int dist[23][23];void floyd(){ int i,j,k; for(k=1;k<=20;k++) fo原创 2012-01-18 10:33:46 · 336 阅读 · 0 评论 -
poj 2387 dijkstra(注意判重)
题意:给出两个整数T,N,然后输入一些点直接的距离,求N和1之间的最短距离。。思路:dijkstra求单源最短路,但是要注意判重。#includeusing namespace std;int dist[1010];int vis[1010];int map[1010][1010];int n;void dijkstra(int st){ int i,j,k,min;原创 2012-01-18 10:35:44 · 1866 阅读 · 0 评论 -
poj 1062 经典最短路(酋长聘礼)
题意:中文题。。不解释。。思路:网上看的,也有不理解的地方,感谢“暴风雪”在群里的讲解,膜拜~1062 经典最短路(酋长聘礼)" title="poj 1062 经典最短路(酋长聘礼)" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-ri原创 2012-01-18 10:36:42 · 457 阅读 · 0 评论 -
poj 1502 最短路(类似于1125)
题意:就是求1到其它节点最短路中最大的,因为消息可以同时传播,类似于poj 1125思路:floyd,最后枚举1到其它节点的最短路,求出其中最大的输出#include#include#define inf 0xfffffffusing namespace std;int dist[105][105];int n;void floyd(){ int i,j,k; for原创 2012-01-18 10:38:40 · 508 阅读 · 0 评论 -
poj 1094 拓扑排序
题意:开始不怎么理解题意,看别人代码大概了解一下,敲完了一直WA。输入n和m,以及m行带两个大写字母和"B,经过一些大小比较后又出现比B小,比A大的字母),输出 :Inconsistency found after i relations,如果第i行就能判断出所有n个字母的大小关系,输出:Sorted sequence determined after i relations 以及升序序列。如原创 2012-01-18 18:10:12 · 382 阅读 · 0 评论 -
poj 1847 floyd
题意:开始没读懂题,后来网上搜的题意。。鄙视自己的英语哈1847 floyd" title="poj 1847 floyd" style="margin-top:0px; margin-right:0px; margin-bottom:0px; margin-left:0px; padding-top:0px; padding-right:0px; padding-bottom:0px; padd原创 2012-01-18 10:32:25 · 426 阅读 · 0 评论 -
poj 1125 dijkstra
题意:用floyd做过,再用dijkstra交一次。。下面的迪杰斯特拉函数可暂时做模版吧。。#include#define max 105#define inf 0xffffffusing namespace std;int tim[max][max];int dijkstra(int st,int n){ int i,dist[max],vis[max]={0},min,原创 2012-01-18 10:34:45 · 426 阅读 · 0 评论 -
poj 1251 1258 2421 2485(最小生成树prime)
poj 1251此题注意输入,还有注意map[i][i]=0,基本就可以AC了#includeusing namespace std;int map[30][30];int lowcost[30];bool vis[30];int n;int prime(){ int i,j,k,min,sum=0; for(i=1;i<=n;i++) lowcost[i]=m原创 2012-01-18 10:42:34 · 354 阅读 · 0 评论 -
poj 1469 匈牙利模版题
题意:其实不太懂。。。给出课程数,学生数。然后给出学生的选课情况,求最大匹配数是否等于课程数。#includeusing namespace std;int link[300];bool g[300][300],vis[300];int n,m;bool dfs(int u){ int v; for(v=1;v<=m;v++) if(g[u][v]&&!vis[v]原创 2012-01-31 12:57:08 · 315 阅读 · 0 评论 -
匈牙利算法及其模版
原文地址:匈牙利算法学习资料(转载)作者:依然二分图最大匹配的匈牙利算法: 二分图是这样一个图,它的顶点可以分类两个集合X和Y,所有的边关联在两个顶点中,恰好一个属于集合X,另一个属于集合Y。 最大匹配: 图中包含边数最多的匹配称为图的最大匹配。 完美匹配: 如果所有点都在匹配边上,称这个最大匹配是完美匹配。 最小覆盖:在转载 2012-01-31 12:15:18 · 559 阅读 · 0 评论 -
poj 1466 匈牙利(最大独立集)
题意:在给出的学生里求出最大的数m,使得m中任意两个学生都不存在romantically involved(有关系),也就是求这个二分图的最大独立集,这个题的最大独立集等于N-最大匹配/2。因为在建图的时候人数扩大了一倍。#includeusing namespace std;bool g[505][505],vis[505];int link[505];int n;bool dfs原创 2012-01-31 18:51:06 · 336 阅读 · 0 评论 -
最小路径覆盖(转载)
原文连接:http://blog.youkuaiyun.com/hqd_acm/article/details/5908134最小路径覆盖 POJ2594 POJ1422由于周五听了SKQ极为简练的“最小路径覆盖”问题,练了练手。 什么叫最小路径覆盖? 就是说,在当前的图上,找N条路径,让这N条路径覆盖图上所有的点,N的最小值就是我们要求的值。根据具转载 2012-02-01 08:43:35 · 372 阅读 · 0 评论 -
poj 1422 最小路径覆盖
题意:给出点数,和边数,还有有向的连通方式,求最小路径覆盖数。大概就是这意思,自己读题没太理解。开始看最小路径覆盖有什么“可重点”,“环”什么的。。这道题我看是有可重点和环啊。。。但是直接做也AC,感觉没啥大区别。#includeusing namespace std;bool g[125][125],vis[125];int n,m;int link[125];bool dfs(i原创 2012-02-01 10:59:03 · 340 阅读 · 0 评论 -
poj 2421 最小生成树(prime) 模版题
题意:给出一个矩阵,代表着城镇直接的距离,之后给出一些已经连通的点,然后求,让所有点都连通的最小花费思路:赤裸裸的最小生成树。。。prime水之。#include#define max 105#define inf 0xffffffint vis[max],map[max][max],lowcost[max],n;//lowcost[i]记录的已经标记的节点(S1)到其它节点i(S原创 2012-01-18 10:39:56 · 600 阅读 · 0 评论 -
poj 1789 根据字符串中字符的差异来确定距离的最小生成树(水)
题意:输入N,然后N行,每行输入一个长度是7的字符串,比较每个字符串上相同位置的字符,如果不同的话这两个点的距离加一思路:prime求最小生成树,1/Q就是最大的值。#includeusing namespace std;int N;int map[2100][2100];char s[2100][10];int dis(char *str1,char *str2){ in原创 2012-02-15 20:44:53 · 390 阅读 · 0 评论 -
poj 1511 spfa
题意:不好理解,看的网上的意思。大体意思就是,在有向图中,求1点到其它点最短路,和其他点到1点最短路的和。思路:正向和反向建图,分别SPFA(1),最后求d[i]的和即可要注意 inf要足够大,同时累加和的时候int型的数据可能会越界,要用__int64.#include#include#define inf 0x7fffffffusing namespace std;struct原创 2012-02-28 22:23:33 · 356 阅读 · 0 评论 -
tarjan
struct edge { int v , nex; }e[maxm];int k ,head[maxn];void addedge(inta,int b) { e[k].v = b; e[k].nex = head[a]; head[a] = k++; }//链式前向星int dfn[maxn]原创 2013-04-26 15:05:02 · 733 阅读 · 0 评论