图论
煦--晨
菜鸟起飞
展开
-
hdu(1232)图论
#include int pre[2000];int fun(int x) -------------------------------------//找x的根节点((((重要函数))){ int r = x; while(pre[r]!=r)原创 2013-08-08 22:06:47 · 510 阅读 · 0 评论 -
hdu 1856 More is better
本题题意:给出关系,可能存在多个宗派; 求出人数最多宗派的人数是多少? 核心代码: pre[yy]=xx; mark[xx]+=mark[yy]; 每确定一个宗派内的关系,就往该宗派的祖宗上加一;原创 2013-11-22 21:20:18 · 525 阅读 · 0 评论 -
hdu 1102 Constructing Roads 最小生成树
把已经建好的路直接合并即可; #include"stdio.h"#include"string.h"#include"stdlib.h"#include"algorithm"using namespace std;int pre[1000];struct point{ int x,y,z;}a[10000];int cmp(point a,point原创 2013-11-24 01:36:52 · 466 阅读 · 0 评论 -
hdu 1198 Farm Irrigation (并查集图形的部分)
首先根据题意上的图形,对map的各个方向赋值,油管道的方向赋值为一;最后根据地形数组p详细记录了各个点各个方向上的信息;最后先对行进行比较,将满足题意的进行合并,然后最一列一列的将满足题意的合并; #include"stdio.h"#include"string.h"int pre[10000],p[600][600][4];int map[11][4]={1,1,-1原创 2013-11-24 16:10:25 · 542 阅读 · 0 评论 -
hdu 1874 (flory)
比较简单;#include"stdio.h"#include"string.h"#define max 99999999int map[300][300];int min(int a,int b){ return a>b?b:a;}void flory(int m){ int i,j,k; for(k=0;k for(i=0;i for原创 2013-11-24 13:40:01 · 467 阅读 · 0 评论 -
hdu 3371 Connect the Cities
简单题型:把有联系的城市直接合并,注意的是要记录合并的总数;#include"stdio.h"#include"string.h"#include"stdlib.h"#include"algorithm"using namespace std;int pre[500];int find(int k){ if(k!=pre[k]) pre[k]=find(p原创 2013-11-24 14:12:10 · 495 阅读 · 0 评论 -
hdu 1598 列举+最小生成树★★
#include#include#includeusing namespace std;#define NN 9999999int pre[10000];struct point{ int x,y,z;}p[20000];int cmp(point a,point b){ return a.z}int find(int x){原创 2013-11-24 22:44:57 · 570 阅读 · 0 评论 -
hdu 1811 拓扑排序+并查集
#include"stdio.h"#include"string.h"#include"vector"#include"queue"#include"algorithm"using namespace std;int pre[30000],degree[30000];vectorint>vet[30000];int sum,n,m;struct point{原创 2013-11-25 17:51:47 · 536 阅读 · 0 评论 -
hdu 1116 Play on Words 并查集+欧拉通路
本题的题意就是拼接单词,只要单词的首个字母与另一个单词的末字母相同他们就能拼接在一起;最后若能把所有的单词拼接在一起(可以形成一个圈)就可以了;所以首先这些首末字母得连通,其次若形成了一个欧拉通路即形成了一个环,则所有初度和入度都相等;如果形成了一条链,则链的第一个和最后一个字母的入度和初度的值差一,链中间字母的入度和初度都相等; #include"stdio.h"#inc原创 2013-11-26 18:56:25 · 582 阅读 · 0 评论 -
hdu 2473 Junk-Mail Filter (设立虚父点,来删除某独立点)
题意很好懂,主要是怎样删除这个集合的一个点是关键;这里要借用一个数组dp【i】,每个点i都对应一个数,删除点i,只是把dp【i】所对应的数改变了m++;依次增大;同时他所对应的节点rank--;最后看集合的个数主要是看rank有几个大于0的, #include"stdio.h"#include"string.h"int pre[2000006],dp[2000006];原创 2013-12-07 19:48:33 · 548 阅读 · 0 评论 -
hdu 3172 Virtual Friends (cmp + 并查集)
此题用一般的方法查找会超时,所以要用到cmp容器来查找;对于cmp是一个会自动排序的容器,利用find函数可以快速查找是否含有某个数;#include#include#include#includeusing namespace std;mapA;#define N 1000006int pre[N];int rank[N]; int find(i原创 2013-12-08 18:03:54 · 461 阅读 · 0 评论 -
hdu 1272 小希的迷宫
和上一篇方法完全一样。。 #include"stdio.h"#include"string.h"int pre[100005];int mark[100005],flag;int find(int k){ if(k!=pre[k]) pre[k]=find(pre[k]); return pre[k];}void fun(i原创 2013-11-22 18:42:11 · 582 阅读 · 0 评论 -
poj 1308 图论
给的不是连续的数字时用标记的方法来做; #include"stdio.h"#include"string.h"int pre[1000005];int mark[1000005],flag;int find(int k){ if(k!=pre[k]) pre[k]=find(pre[k]); return pre[k];}v原创 2013-11-22 18:40:26 · 584 阅读 · 0 评论 -
poj 2236Wireless Network (并查集的应用)
题目的意思就是现在有n台电脑,然后告诉你这些电脑的坐标,并且当两台电脑的距离小于或者等于这个给定的d时,这两台电脑视为是连通的,现在的问题就是输入S a b然后问你a和b是不是连通的.这个题目的大体的做法和通常的并查集是一样的,查找祖先,合并节点.但是在合并的时候首先要求是这个电脑必须被修复过,也就是下面的visited数组对应的值是1,并且这个距离是小于或者等于d.判断的时候只需原创 2013-11-21 11:14:41 · 640 阅读 · 0 评论 -
hdu(1863)畅通工程
#include#include#includeint pre[2000];using namespace std;struct point { int x,y,z;} a[2000];bool cmp(point a,point b){ return a.z} int fun(int x){ if(x!=pre[x])pre[x原创 2013-08-08 22:48:35 · 536 阅读 · 0 评论 -
hdu(1856)More is better
#include"stdio.h"#include"string.h"int pre[10000005];int link[10000005];int a[100005],b[100005];int find(int k){return k==pre[k]?k:pre[k]=find(pre[k]);}int main(){int m,i,k,max;原创 2013-08-08 20:23:10 · 547 阅读 · 0 评论 -
hdu(1233)还是畅通工程
先将距离从大到小排序;只要两点之间达到了联通,便不需要再添加新的距离。。#include #include using namespace std;#include int pre[2000]; struct point { int x,y,z; }a[40000],d; int cmp(point a,point b){原创 2013-08-08 22:26:41 · 658 阅读 · 0 评论 -
hdu(1198)Farm Irrigation
这个并查集比较新颖:首先用结构比较简单;数组p每组表示四个方向是否连通,(上下左右)然后分别在水平和竖直方向上看是否连通,前提是水平(j和j+1上有右和左都为一); #include"stdio.h"#include"string.h"#include"stdlib.h"char str[1000][100];int map[1000][1000];int pr原创 2013-08-10 19:19:12 · 557 阅读 · 0 评论 -
poj(3228)Gold Transportation
用最大流和并查集应该都可以,但不知为何,最大流老是超时,囧。。。题意: 给出一幅无向图,有些节点有财富,有些节点有仓库。要求把所有财宝运至仓库,使经过的最大边最小。解法: 并查集加Kruskal。将每个节点的财富处理成负值,仓库大小为正值,加起来,然后现在的目的是构成一幅森林,使所有节点的值为非负,并使经过的最大边最小。显然的类似Kruskal的贪心,将边从小到大排序,如果较小边和比它原创 2013-08-10 19:22:19 · 683 阅读 · 0 评论 -
hdu(1596)
用floyd求最大值。 #include"stdio.h"#include"string.h" double map[1010][1010];#define max(a,b) a>b?a:b貌似这样省时些,不然会超时。。int main(){ int m,n,i,j,k,h,p; while(scanf("%d",&m)!=EOF) { for(i=1原创 2013-08-10 19:26:18 · 512 阅读 · 0 评论 -
Outlets
最短路径问题,与一般题的区别是,有两个点必须用一条直线直接连接,此时就把这两点的距离算出来,并建立关系,pre【k】=h;其他的用最短路径就很好解决了,注意的是建立两个数组,防止发生覆盖; #include"stdio.h"#include"algorithm"#include"math.h"using namespace std;int pre[20000];原创 2013-10-31 16:49:06 · 500 阅读 · 0 评论 -
图论练习
名人名言:爱情使是非概念混淆不清;强烈的爱情和骄傲的野心都是没有疆界的——约·德莱顿 =============================以下是最小生成树+并查集======================================【HDU】1213 How Many Tables 根蒂根基并查集★1272 小希的迷宫 根蒂根基并查集★1325&原创 2013-11-03 20:23:00 · 627 阅读 · 0 评论 -
hdu(4996) D-City 并查集
/*本题并不是简简单单地考察并查集,他考察的是你是否理解并查集的原理,是怎样得到的;独立的个数;肯定越来越多,所以我们从最下面开始判断,要明白,刚开始 肯定要k--;但是对于都没有联系的点来说,此时独立的个数肯定为n个(最后输出的),第一个点可能减为了零,但全连同时为一,所以第一个点就不输出了。。*/ #include"stdio.h"#include"str原创 2013-08-27 15:20:00 · 777 阅读 · 0 评论 -
hdu 2818 Building Block (并查集)(根据父节点来更新)
题意:有两种操作:一个是M,a,b;表示a集合所有的元素,置于b集合之上; 二是C ,a;表示a集合下的元素的个数有多少个;此题;要构造两个数组,一个是rank【i】,他记录的是i集合元素的总个数;另一个是under【i】,记录的是i元素下的个数,这个集合要更新,在并查集里进行更新 ,他会从k一直更新到他的父节点原创 2013-12-21 17:00:57 · 463 阅读 · 0 评论