
Graph theory
文章平均质量分 64
X-Wyatt
For free 邮箱whitezhangv5@gmail.com
展开
-
HDU 1035
搜索,就这样了。第一次多输出了点东西结果WA了#include #include #include using namespace std;#define LEN 11int map[LEN][LEN];int point[][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};int row, col;void find(int x, in原创 2012-12-05 19:51:20 · 424 阅读 · 0 评论 -
ZOJ 2158 Prim
先算出节点之间的直接距离,然后再用Prim就能算出来了#include #include #include #include using namespace std;#define LLEN 2005#define MMAX 0x3fffffffint map[LLEN][LLEN];char node[LLEN][10];int t;int dis(int原创 2013-08-06 10:42:37 · 812 阅读 · 0 评论 -
ZOJ 1914 Prim Kruskal
先计算出最小生成树,然后在输出第p-s小的边#include#include#include#include#define N 501#define Maxint 9999999double c[N][N],x[N],y[N],dist[N];int s[N], closest[N],n;int cmp(const void *a,const void *b) {原创 2013-08-06 12:39:39 · 708 阅读 · 0 评论 -
POJ 1679 次小生成树
判断最小生成树是否唯一,方法是这样的:1. 对图中每个点,扫描其他的边,如果存在其他权值相同的边,则对改边作标记2. 然后用 Kruskal或者Prim 求MST3. 求的MST后,如果该MST不包含作了标记的边,即可判定MST唯一;如果包含作了标记的边,则依次去掉这些边在求MST,如果求的MST权值和原MST权值一样,即可判定MST不唯一。这里在在第二次计算生成树时,不能原创 2013-08-07 09:46:10 · 792 阅读 · 0 评论 -
HDU 1879
最小生成树,不过有些边是已经有的,有些边是没有的。这里有两种算法,一种是如下采用并查集的方式,另一种是将已经有的边的权值置为0,这样再用Prim或者Kruskal算最小生成树的时候就一定会将这条边选入。#include #include #include #include using namespace std;typedef struct Edge { int u,原创 2013-08-07 10:09:23 · 832 阅读 · 0 评论 -
ZOJ 1298 Dijkstra
计算多米诺骨牌推倒推倒的时间。这里先用Dijkstra计算单源最短路径,然后在其他不在该路径中的边所需要推倒的时间,time[i] + time[j] + edge[i][j]/2即可。这里要枚举#include #include #include using namespace std;#define NLEN 510#define INF 1000000int原创 2013-08-07 16:57:04 · 1005 阅读 · 0 评论 -
ZOJ Dijkstra
成语接龙,告诉的是边的信息,但是这个其实就是告诉的一个起点,和一条边,终点可能是不可达的,所以最终告诉你的还是点的信息。先处理字符串,存入图中,然后就可以用Dijkstra了。#include #include #include using namespace std;#define NLEN 1010#define INF 0x3fffffffint cost[原创 2013-08-08 11:23:43 · 701 阅读 · 0 评论 -
算法导论 最小生成树的形成
1. 给定一个图G和一棵最小生成树T,假定减小了不在T中的某条边的权值。请给出一个算法,来寻找经过修改的图中的最小生出树。这是算法导论中的一道思考题,其实想一下的话并不难,减小一条边,首先比较这条边和最小生成树中的最大边,如果还是比这个大的话就说明原来那个生成树仍然是最小生成树,如果小的话,这个时候先搜索出这条边与生成树中其他边所能形成的环,然后从这个环中去掉最长边,剩下的边即可构成原创 2013-08-08 17:55:29 · 1916 阅读 · 0 评论 -
POJ 1251 优先队列 Prim
Prim 算法是每次都将未加入到结合V 中,并且边是最短的点加入到 V 中,从而最终形成最小生成树。这里可以使用优先队列进行算法的优化。这里的结构体里 v, next, w的 v是起点,w是权值,而next是head 的索引值,而head 是每次都更新的值,在使用 Prim 做更新的时候就不用像原来那样逐个遍历,而是使用head索引来依次查找。这里在搜索的时候,不是像之前使用Prim那样逐原创 2013-08-09 19:50:31 · 1501 阅读 · 0 评论 -
POJ 2421
水题,直接贴代码了#include #include #include #include using namespace std;#define LLEN 105int map[LLEN][LLEN];int p[LLEN];typedef struct Edge { int u, v; int w;}Edge;Edge edge[10050];int cm原创 2013-09-05 10:56:00 · 664 阅读 · 0 评论 -
HDU 1242
搜索水题:#include #include #include using namespace std;#define MMAX 999999int n, m;int dp[210][210];int map[210][210];int point[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};void dfs(int x, int y, in原创 2014-04-06 21:11:20 · 635 阅读 · 0 评论 -
HDU 1455
深搜+剪枝,比较容易超时#include #include #include #include using namespace std;int mark[111];int len[111];int ans, num, aim, flag;int cmp(const void *a,const void *b) { return *(int *)a-*(int原创 2014-04-10 15:36:04 · 663 阅读 · 0 评论 -
HDU 2489 Prim+DFS
因为是完全图,所以可以采用如下的方式进行DFS搜索,枚举出每一种情况,然后用Prim进行计算。#include#include#define N 20int n,m,vis[N], ans[N], pre[N], hash[N];double G[N][N], weight[N], minCost[N], minRatio;double prim(){ memset(ha原创 2013-08-03 21:23:33 · 633 阅读 · 0 评论 -
HDU 1598
将边先排序,然后从最小的边开始枚举,当发现需要查找的两个点在一个并查集里面的时候就计算差值,并与min比较。#include #include #include #include using namespace std;#define LLEN 210#define INF 0x3ffffffftypedef struct edge { int u, v; int w;原创 2013-08-03 18:20:56 · 1167 阅读 · 0 评论 -
HDU 1241 DFS
深搜水题:#include #include #define LEN 1001char map[LEN][LEN];int point[][2] = {{0, 1}, {0, -1}, {1, -1}, {-1, 1}, {1, 1}, {-1, -1}, {1, 0}, {-1, 0}};int row, col;void judge(int x, int y) {原创 2012-11-24 00:13:43 · 441 阅读 · 0 评论 -
ZOJ 2913 BFS
需要求最短路,所以依旧是广搜#include #include #include #include using namespace std;#define LEN 10000#define INF 100000int mz[LEN];int n, m;int edge[LEN][10];int res[LEN];int reach[LEN];int cur;i原创 2013-06-16 21:01:06 · 703 阅读 · 0 评论 -
ZOJ 1586 Prim
在用 Prim的时候只要将 adapter 事先算如边中即可#include #include #include #include using namespace std;#define LLEN 10010#define MLEN 1010#define INF 999999999int adapter[LLEN];int map[MLEN][MLEN];void原创 2013-08-03 10:40:25 · 912 阅读 · 0 评论 -
HDU 1233 Prim
prime水题:#include #include #define LEN 101#define MMAX 9999999int map[LEN][LEN];int prime(int s, int city) { int dist[LEN], used[LEN]; int i, j; int res = 0; memset(used, 0, sizeof(used))原创 2012-11-26 18:52:37 · 414 阅读 · 0 评论 -
ZOJ 1542 Kruskal
一开始输出弄错了,卡了好久直接上代码了#include #include #include #include using namespace std;#define ELEN 15005#define VLEN 1005typedef struct Edge { int u, v; int w;}Edge;Edge e[ELEN];int p[VLEN];i原创 2013-08-02 15:04:48 · 675 阅读 · 0 评论 -
POJ 1178 Floyd
先给一个我最先写的一个代码吧。总体思路是这样的,对于每个输入的点,都进行一次广搜,打出到达其他点的最短路径(这个效率相比于floyd太低了)再加在ans数组当中,最后搜索出最小值,并输出。虽然这个代码能过很多数据,但是 Discuss 里A1A2A3H2H5H6H7H8C1C2C5C6C7E2E3E4E5E6E7E8 就过不了。至于原因还望大牛们给予指点。我预测可能是广搜有问题,我原以为,用广原创 2012-09-14 14:31:18 · 520 阅读 · 0 评论 -
HDU 1102 Kruskal
一开始边开少了,结果RE了一次。改了一下边的大小就过了Kruskal算法就是找边,先把边都存起来,然后排序,挨个查找并且利用并查集判断#include #include #include #include using namespace std;#define LLEN 102#define EDGELEN 10010int map[LLEN][LLEN];type原创 2013-08-02 08:51:30 · 712 阅读 · 0 评论 -
ZOJ 1649 BFS
搜索最短路径,那么用深搜肯定就不行了,深搜只能用来搜索可行解,但是答案并不一定是最优的,所以这里就用广搜了#include #include #include #include using namespace std;#define LEN 201#define INF 10000000int dir[4][2] = {{1, 0}, {-1, 0}, {0, 1}原创 2013-06-16 12:12:44 · 589 阅读 · 0 评论 -
ZOJ 1091 BFS
广搜,由于要记录步数,所以又用到了滚动队列。一开始没判断起点和终点在一起的情况,WA了一次#include #include #include #include #include using namespace std;char ss[3], dd[3];int map[9][9];int dx, dy;int point[8][2] = {{1, 2}, {原创 2013-07-16 12:41:29 · 787 阅读 · 0 评论 -
HDU 3371 Kruskal
这里边比较多,所以利用Kruskal算法#include #include #include #include using namespace std;#define LLEN 25005int n, m, k;int map[505][505];int conn[505][505];typedef struct Edge{ int u, v; int w;}E原创 2013-08-01 23:22:33 · 819 阅读 · 0 评论 -
ZOJ 1203 Kruskal
Kruskal的题,首先计算边,然后排序遍历。中途由于格式错误PE了,改了一下。#include #include #include #include #include using namespace std;#define LLEN 105#define SSIZE 10010typedef struct Point { double x, y;}Point;原创 2013-08-02 13:38:29 · 742 阅读 · 0 评论 -
HDU 1518
和上一题一样#include #include #include #include using namespace std;int len[30];int mark[30];int ans, m;int aim;void dfs(int now, int finish, int k) { if(finish == 4) { ans = 1; return;原创 2014-04-10 16:03:40 · 825 阅读 · 0 评论