摘要:Codeforces Round #270D:http://codeforces.com/contest/472/problem/D题意:给以一张图,用邻接矩阵表示,现在问你这张图能不能够是一棵树?(并且边权都是正的)题解:看了题解才知道。如果这张图是一棵树的话,那么最小生成树一定满足条件。所以可以...
阅读全文
摘要:poj2728:http://poj.org/problem?id=2728题意:给你n的点,每一个点会有一个坐标(x,y),然后还有一个z值,现在上你求一棵生成树,是的这棵生成树的所有边的费用/所有边的距离最小,其中,边费用是指两点之z差值的绝对值,边距离是指两点之间的距离。题解:这一题就是求最小...
阅读全文
摘要:hdu4750:http://acm.hdu.edu.cn/showproblem.php?pid=4750题意:给你一个带权无向图,然后让你求这样的点对s,t,使得s--t的所有路径上的最大的边的最小值>=d,输出这样的点数有多少条。题解:这一题的解法实在是太妙了。利用克努斯卡尔的生成树的额思想,...
阅读全文
摘要:hdu4786:http://acm.hdu.edu.cn/showproblem.php?pid=4786题意:给你一个无向图,然后其中有的边是白色的有的边是黑色的。然后问你是否存在一棵生成树,在这课生成树上白色边的数量是一个斐波那契数。题解:完全没有那样的思想,一道现场水题,就是不会啊,实力太弱...
阅读全文
摘要:hdu2489:http://acm.hdu.edu.cn/showproblem.php?pid=2489题意:给你一个n个节点图,图的点有边权和点权,然后选取m个节点的子图,然后求这个一棵树,然后让这棵树的所有边权之和/所有点权之和的值最少。题解:n很小,只有15,所以可以直接暴力,枚举每一种情...
阅读全文
摘要:Zepto Code Rush 2014:http://codeforces.com/problemset/problem/436/C题意:k个点,每个点都是一个n * m的char型矩阵。对与每个点,权值为n * m或者找到一个之前的点,取两个矩阵对应位置不同的字符个数乘以w。找到一个序列,使得所...
阅读全文
摘要:poj3026:http://poj.org/problem?id=3026题意:在一个y行 x列的迷宫中,有可行走的通路空格’ ‘,不可行走的墙’#’,还有两种英文字母A和S,现在从S出发,要求用最短的路径L连接所有字母,输出这条路径L的总长度。题解:一格的长度为1,而且移动的方法只有上、下、左、右,所以在无任何墙的情况下(根据题意的“分离”规则,重复走过的路不再计算因此当使用prim算法求L的长度时,根据算法的特征恰好不用考虑这个问题(源点合并很好地解决了这个问题),L就是最少生成树的总权值W由于使用prim算法求在最小生成树,因此无论哪个点做起点都是一样的,(通常选取第一个点),因此起点
阅读全文
摘要:poj1258:http://poj.org/problem?id=1258题意:生成树的模板题。简单题。 1 #include 2 #include 3 #include 4 #include 5 #define INF 100000000 6 #define MAXN 103 7 using namespace std; 8 int n,m; 9 int Edge[MAXN][MAXN];10 int lowcost[MAXN];11 int nearvex[MAXN];12 void prim(int u0){13 int i,j;14 int sumweight=0;1...
阅读全文
摘要:poj1751:http://poj.org/problem?id=1751题意:给你n个城市,每个城市的坐标给你,然后为了是每个城市都连通,需要在已经建了一些街道额基础上,再次建一些街道使其连通,求使得所建街道最短的那些边。题解:直接求一棵生成树,把已经建好的边的边权设置为0,用prim走一遍。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define INF 100000000.0 7 using namespace std; 8 struct Node{ 9 int x;10 int y;11 }no...
阅读全文
摘要:poj1789:http://poj.org/problem?id=1789题意大概是这样的:用一个7位的string代表一个编号,两个编号之间的distance代表这两个编号之间不同字母的个数。一个编号只能由另一个编号“衍生”出来,代价是这两个编号之间相应的distance,现在要找出一个“衍生”方案,使得总代价最小,也就是distance之和最小。题解:问题可以转化为最小代价生成树的问题。因为每两个结点之间都有路径,所以是完全图。 此题的关键是将问题转化为最小生成树的问题。每一个编号为图的一个顶点,顶点与顶点间的编号差即为这条边的权值,题目所要的就是我们求出最小生成树来。这里我用prim算
阅读全文
摘要:poj2349:http://poj.org/problem?id=2349题意:有卫星电台的城市之间可以任意联络。没有卫星电台的城市只能和距离小于等于D的城市联络。告诉你卫星电台的个数S,让你求最小的D.题解: 生成最小生成树,去掉最长的S条边后,剩下最长的边就是D.也就是求最小生成树中第S+1长的边。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #define INF 100000000.0 7 using namespace std; 8 int cas,x,y,top; 9 int n,s;10 double low
阅读全文
摘要:zoj1586:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1586题目大意:最小生成树,不只算两点之间的费用,还要算点的费用,并不是个点只算一次费用,而是每出现一次算一次。题解:其实只需要在算距离时,把两点的距离加入其中在排序就行了。 1 #include 2 #include 3 #include 4 #include 5 #define INF 100000000 6 using namespace std; 7 int n,cas; 8 int g[1002][1002]; 9 int lowcost[100
阅读全文
摘要:poj2031:http://poj.org/problem?id=2031题意:就是给出三维坐标系上的一些球的球心坐标和其半径,搭建通路,使得他们能够相互连通。如果两个球有重叠的部分则算为已连通,无需再搭桥。求搭建通路的最小费用(费用就是边权,就是两个球面之间的距离)。题解:其实就是图论的最小生成树问题球心坐标和半径是用来求 两点之间的边权 的,求出边权后,把球看做点,用邻接矩阵存储这个无向图,再求最小生成树,非常简单的水题把球A和球B看做无向图图的两个结点,那么边权 = AB球面距离 = A球心到B球心的距离 – A球半径 – B球半径 .注意若边权 2 #include 3 #inclu
阅读全文
摘要:poj2421:http://poj.org/problem?id=2421题意:这一题也是最小生成树,不过它要求修的路在下面还有一行是已经修的路所以将其权值赋值为零。题目给的数值的意思是每个点离其他点的距离 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int n,q,num,pa[102],cnt,sum; 8 int g[101][101],a,b; 9 struct Node{10 int u;11 int v;12 int w;13 boo...
阅读全文
摘要:poj1287:http://poj.org/problem?id=1287题意:平面上有许多点,又有许多边。每条边有一定的长度,且只会连接两个不同的点。现需要从这些边中选择某些边,使得尽可能多的点直接或间接相连。同时,又要选取的边的总长度最小。题解:本题就是去除重边,然后kruska运用。去重时候,我采用一个二维数组选取最小的边放进数组,然后遍历数组,如果有边则struct存入要处理的边。但是,看了别人的看法;程中可无视重边,因为排序之后,每次总是把最小的边加入,而且没两个点只能加一次,所以可以无视。 1 #include 2 #include 3 #include 4 #include 5
阅读全文
摘要:poj1251:http://poj.org/problem?id=1251题意:求n个村庄之间的最小生成树。题解:建好图,然后之间kruska直接解题。 1 #include 2 #include 3 #include 4 #include 5 using namespace std; 6 int n,num,k,cnt,sum,tt,next1; 7 char s1,s2; 8 int pa[28]; 9 struct Node{10 int u;11 int v;12 int w;13 bool operator=0;s=pa[s]);24 whi...
阅读全文
摘要:poj1861:http://poj.org/problem?id=1861题意::求一个最小生成树,边和边权都给出了,只是输出,要求输出最大权值的边的权值,边的条数以及都是什么边 题解:直接用kruska,求最小生成树,最大边,为最后加入的边。边数为n-1;然后依次输出生成树。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 const int MAXN=1002; 8 int n,m,num,pa[MAXN],top,counts[15003];//分别标记点数,边数,等 9 .
阅读全文
摘要:zoj1203:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1203题意:给定平面上N个城市的位置,计算连接这N个城市所需线路长度总和的最小值题解:每两个点之间建一条边,然后求这一棵最小生成树。 1 #include 2 #include 3 #include 4 #include 5 #include 6 using namespace std; 7 int n,pa[102],cnt,num;//分别记录点的个数 ,并查集,边的个数,以及处理的边的个数 8 struct Node{ 9 double ...
阅读全文
摘要:zoj3204:最小生成树,要求最小字典序的解。用kruscal算法,先排序,输出的时候也要排序。 1 /* 2 zoj3204 3 4 5 解题思路: 6 赤裸裸的最小生成树。只是要求输出字典序最小的连接方案。 7 所以在边的排序时要注意了,有可能存在边的权值是相同的边。 8 所以在这种情况下,要按他们的顶点序列排序。直接把STL搬上了,很好很强大。 */ 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #inc...
阅读全文