图论
Hearthougan
这个作者很懒,什么都没留下…
展开
-
POJ 1659 Frogs' Neighborhood
给定一个非负整数列,判断其是否是可图的;(Havel-Hakimi定理) 由非负整数组成的非增序列s:d1, d2, …, dn(n ≥2, d1 ≥1)是可图的,当且仅当序列s1: d2– 1, d3– 1, …, d(d1+1)– 1, d(d1+2), …, dn是可图的。序列s1中有n-1个非负整数,s序列中d1后的前d1个度数(即d2~d(d1+1))减1后构成s1中的前原创 2013-10-02 20:48:20 · 571 阅读 · 0 评论 -
多米诺骨牌(欧拉通路,欧拉通路Test)
题目描述: 给定n张骨牌,每张骨牌有左右两个点数(从1到6)。问能不能通过交换骨牌的顺序和交换左右2个点数,使得任意两个相邻骨牌的相邻段为相等的数字。输入描述: 输入文件中有多个测试数据。每个测试数据的第一行为一个整数N,1≤N≤100,表示多米诺骨牌的总数;接下来N行对每一张牌进行描述:每一行表示一张牌的左右两段的数字(1到6),用空格隔开。输入文件最后一行为0,原创 2013-11-03 11:41:31 · 2887 阅读 · 0 评论 -
Place the Robots zoj 1654
#include #include #define MAX 51int m, n; //地图的大小m*n,(1<= m, n <=50)char map[MAX][MAX]; //地图int x[MAX*MAX], y[MAX*MAX]; //x[i]表示与Xi匹配的Y顶点,y[i]表示与Yi匹配的X顶点int xs[MAX][MAX], ys[MAX][MAX]; //水平原创 2013-11-06 10:41:56 · 659 阅读 · 0 评论 -
二分图最大匹配之匈牙利算法模板
匈牙利算法的原理为:从当前匹配M(如果没有匹配,则取初始匹配为M=Ø)出发,检查每一个未盖点,然后从它出发寻找可增广路,找到可增广路,则沿着这条可增广路进行扩充,直到不存在可增广路为止。根据从未盖点出发寻找可增广路搜索的方法,可以分为:1) DFS增广;2) BFS增广;3) 多增广路(Hopcroft-Karp算法) 本文只实现1),2)两种方法 const i原创 2013-11-13 11:50:14 · 1038 阅读 · 0 评论 -
zoj 2770
#include #include #include using namespace std;const int MAXN = 1010;const int MAXM = 23000;const int INF = 100000000;struct Edge{ int u, v, w;}edges[MAXM];int n;int EN;int dist[MA原创 2013-12-28 14:38:09 · 1237 阅读 · 0 评论 -
zoj 2770 Burn the Linked Camp
Bellman_Ford实现:点击打开http://blog.csdn.net/hearthougan/article/details/17631941差分约束系统的SPFA实现:SPFA速度比Bellman_Ford快多了。链表实现,表头不存数据。#include #include #include #include using namespace std;const in原创 2013-12-30 20:48:02 · 977 阅读 · 0 评论 -
zoj 1508 Intervals
#include #include #include #include using namespace std;const int INF = 10000000;const int MAXN = 50010;struct ArcNode{ int to; int weight; ArcNode* pNext; ArcNode() { to = 0; wei原创 2013-12-31 23:58:42 · 700 阅读 · 0 评论 -
poj 2240 zoj1092 Arbitrage
#include #include #include using namespace std;const int MAXN = 35;const int MAXM = 1000;struct exchange{ int ci, cj; double cij;}Ex[MAXM];char name[MAXN][20], a[20], b[20];doubl原创 2013-12-21 19:27:00 · 743 阅读 · 0 评论 -
poj 1556 The Doors
#include #include #include #include #include using namespace std;const int INF = 100000000;const int MAXN = 100;struct Point{ double x; double y;};struct Edge{ int u; i原创 2013-12-22 14:59:39 · 848 阅读 · 0 评论 -
SPFA
算法思想: Bellman-Ford算法的时间复杂度比较高,为O(n3)或O(nm),原因在于Bellman-Ford算法要递推n次,每次递推,扫描所有的边,在递推n次的过程中很多判断是多余的。SPFA算法(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余判断。 SPFA算法的大致流程是用一个队列来进原创 2013-12-25 14:54:22 · 986 阅读 · 0 评论 -
Floyd Test
算法思想: Floyd(弗洛伊德)算法的基本思想是:对一个顶点个数为n的有向网(或无向网),设置一个n×n的方阵A(k) ,其中除对角线的矩阵元素都等于0外,其他元素A(k) [i][j] (i≠j)表示从顶点vi到顶点vj的有向路径长度,k表示运算步骤,k = -1, 0, 1, 2, …, n-1。初始时:A (-1)= Edge(图的邻接矩阵),即初始时,以原创 2013-12-26 21:50:19 · 701 阅读 · 0 评论 -
poj1149迈克卖猪问题(PIGS)
/**建图:: 将顾客看作是除源点和汇点的结点,并且另设两个结点,源点和汇点:源点和每个猪圈的第一位顾客连边,边的权值是开始时猪圈中猪的数量:若源点和某个结点有重边,则将权值合并(因此,从原点流出的流量就是所有猪圈所能提供猪的数量):顾客j紧跟顾客i打开某个猪圈,则置的权值为无穷大,因为顾客j紧跟顾客i之后,迈克可以根据顾客j的需求,调来足够多的猪。:每个顾客都和汇点连接,原创 2014-02-23 15:52:49 · 1072 阅读 · 0 评论 -
有上下界的网络流
#include #include #includeusing namespace std;const int INF1 = 100000000;const int INF2 = 10000;const int MAXN = 20;struct Arctype{ int b, c, f;};Arctype Edge[MAXN][MAXN];Arctype Ac原创 2014-02-25 10:22:49 · 727 阅读 · 0 评论 -
poj1273 Drainage Ditches
#include #include using namespace std;const int INF = 100000000;const int MAXN = 210;int Graph[MAXN][MAXN];int dist[MAXN];int n, m;int MIN(int a, int b){ return a < b ? a : b;}boo原创 2014-02-26 20:54:02 · 627 阅读 · 0 评论 -
poj 3268
点击打开题目#include #include #include #include using namespace std;const int INF = 10000000;const int MAXN = 1010;struct ArcNode//邻接表结构{ int to; int weight; ArcNode* pNext; Ar原创 2013-12-25 15:02:04 · 755 阅读 · 0 评论 -
poj 1386 Play on Words
分析: 在本题中,每个单词只有首尾两个字母很关键,并且每个单词可以看成连接首尾两个字母的一条有向边(由首字母指向尾字母)。这样每个测试数据中的一组单词可以构造成一个图:图中的顶点为26个小写字母,每个单词为图中的一条边。例如,本题样例输入中两个测试数据所构造的有向图如图所示。 构造好有向图后,题目要判定是否可以经过重组使得每个单词第一个字母跟前一个单词最后一个字母相原创 2013-11-02 15:41:04 · 860 阅读 · 0 评论 -
Door Man poj 1300
题目大意: 沿着一个通道,穿过这些大房间,并把房门关上。你的问题是能否找到一条路径经过所有开着门的房间,并使得:1) 通过门后立即把门关上;2) 关上了的门不再打开;3) 最后回到你自己的房间(房间0),并且所有的门都已经关闭了。 分析:本题实际上是判断一个图中是否存在欧拉回路或欧拉通路,要分两种情况考虑:1)如果所有的房间都有偶数个门(通往其他房间),那么有原创 2013-11-02 13:45:58 · 955 阅读 · 0 评论 -
ZOJ 1364 Machine Schedule
#include #include using namespace std;const int MAXN = 105;int xs[MAXN],ys[MAXN];int mk[MAXN];int nx, ny;int g[MAXN][MAXN];int path( int u ){ for(int v = 1; v <= ny; ++v) {原创 2013-10-02 20:52:46 · 763 阅读 · 0 评论 -
hdu 2377 zoj 2913
点击打开题目本题就是求中心区域设置一个数组res[i]用来存放每一个区域i到达公交路线上所有区域的最大值,最后再求res[i]的最小值,则i即是求得的中心区域;利用BFS搜索以及滚动数组的特性即可以求出。 参见代码:#include #include #include #include #include using namespace std;#defi原创 2013-10-07 14:09:30 · 901 阅读 · 0 评论 -
2412 ZOJ Farm Irrigation
/**因为每一块地,最多只有四个水管的接口,故而可以把每一块土地上,下,左,右,都标记成0或1(0,代表该方向没有接口;1,代表该方向有接口)DFS(int x, int y){从第一块开始搜索,如果:该土地的1.Land[x][y].up=1,则如果和其他土地连通必有,Land[x-1][y].down = 1;(注意:Land[x-1][y]是在Land[x][y]的上方)2.Lan原创 2013-07-25 09:26:29 · 556 阅读 · 0 评论 -
ZOJ 2165 Red and Black
题目简单搜索,注意W,H各表示什么;#include #include #include using namespace std;const int MAXN = 25;char map1[MAXN][MAXN];int W, H;int stepnum;int dir[4][2] = { {-1, 0}, {0, 1}, {1, 0}, {0, -1} };b原创 2013-10-07 10:10:57 · 989 阅读 · 0 评论 -
ZOJ 1649 Rescue
本题要求从r 位置出发到达Angel所在位置并且所需时间最少,适合采用BFS求解。但是BFS算法求出来的最优解通常是步数最少的解,而在本题中,步数最少的解不一定是最优解. 在本题中,并没有使用标明各位置是否访问过的状态数组visited,也没有在BFS过程中将访问过的相邻位置设置成不可再访问,那么BFS过程会不会无限搜索下去呢?实际上是不会的,因为从某个位置出发判断是否需要将它的相邻位原创 2013-10-07 11:41:14 · 984 阅读 · 0 评论 -
2412 zoj
/**因为每一块地,最多只有四个水管的接口,故而可以把每一块土地上,下,左,右,都标记成0或1(0,代表该方向没有接口;1,代表该方向有接口)DFS(int x, int y){从第一块开始搜索,如果:该土地的1.Land[x][y].up=1,则如果和其他土地连通必有,Land[x-1][y].down = 1;(注意:Land[x-1][y]是在Land[x][y]的上方)2.Lan原创 2013-10-06 13:01:45 · 686 阅读 · 0 评论 -
zoj 1008 Gnome Tetravex
题目 点击打开链接 #include #include using namespace std;const int MAXN = 50;int map1[MAXN][MAXN];//存放的是已匹配的方块标号,如果可以实现题目结果,则最后map1中即是所求的一种情况。int n;bool tmp;struct Node{ int up, right, do原创 2013-10-06 21:14:17 · 773 阅读 · 0 评论 -
poj 1094 Sorting it all out
这题很奇怪,在zoj上一直过不了,不知道问题出现在哪里。不过在poj上过了#include #include #include #include #include using namespace std;int kcount[26];//入边表,记录定点的入度int temp[26];//就是kcount的拷贝,在拓扑排序时用于修改char relation[3],seq[原创 2013-10-13 11:58:42 · 602 阅读 · 0 评论 -
poj 2585 Window Pains zoj 2193
代码预处理了一下kinds(),表示覆盖方格(i, j)的窗口的集合,本题利用字符串的特性来储存的。如果 !g[ screen[i][j] ][ cover[i][j][p] - '0' ] && ( screen[i][j] != cover[i][j][p] - '0' ),则存在一条有向边。本题把每个窗口都抽象成一个顶点,如果窗口X覆盖窗口Y的话,则存在一条有向边,最后利用拓扑排序,原创 2013-10-14 08:02:17 · 1109 阅读 · 0 评论 -
zoj 1083 Frame Stacking
#include #include #include using namespace std;const int SIZE=30,NUM=26;struct square{ int up, right, down, left;}alpha[NUM];int N,M,cnt,id[NUM];//cnt 图的种类数目,id[i]表示顶点i的入度bool cover[SIZE原创 2013-10-15 21:20:03 · 1030 阅读 · 0 评论 -
poj 2112 Optimal Milking
/**先用floy求出各个挤奶器到各个奶牛的最短距离,因为题中给的距离不一定是最短的!然后再用二分的方法去找答案,即在0~max(max为奶牛到挤奶器可能的最大距离,我认为是200*200=40000)用二分查找的方法去找最大距离的最小值;不断用mid的值去建网络流图添加源点0,汇点n+1,源点到所有挤奶器的距离为m.即map2[0][1..k]=m;奶牛到汇点的距离为1即map2[k+原创 2013-10-25 10:14:07 · 549 阅读 · 0 评论 -
1459 Power Network
设容量网络为G(V, E),f是其可行流,对于一个残留网络G'(V, E),如果一个函数d将顶点集合V映射到非负整数集合,则称d是关于残留网络G'的距离函数(distance function)。d(u)称为顶点u的距离标号(distance label)。 如果距离函数d满足:(1) d(Vt) = 0,(2) 对G'中的任意一条弧,有d(u)≤d(v)+1,则称距离函数原创 2013-10-26 17:26:11 · 738 阅读 · 0 评论 -
zoj 1203 Swordfish
最小生成树,简单的模板题#include #include #include #include #include #include using namespace std;const int MAXN = 110;const int MAXM = 5010;struct Edge{ int u, v; double w;};int n, m;int p原创 2013-10-29 21:00:23 · 735 阅读 · 0 评论 -
网络流 练习
题目:利用Ford_Fulkerson (标号法)求图1(a)及2(a)所示的容量网络的最大流,输出各条弧及其流量,以及求得的最大流流量。 (1)(2)分析: 在下面的程序中,以邻接矩阵存储容量网络,但邻接矩阵中的元素为结构体ArcType类型变量。该结构体描述了网络中弧的结构,包含容量c和流量f两个成员。在程序中,还定义了三个数组:flag[n], prev原创 2013-10-23 16:05:57 · 857 阅读 · 0 评论 -
poj 3259 Wormholes
http://poj.org/problem?id=3259判断是否存在负权回路,如果存在,则表明某个顶点i入队列的次数超过了n次,n是顶点的数目。#include #include #include #include #include using namespace std;const int MAXN = 550;const int INF = 10000000;原创 2013-12-25 18:01:49 · 648 阅读 · 0 评论