随笔分类 - 图论·其它
摘要:题意: 已知一个树形的地图,要在其间建设一条公路,每个公路上的点只经过一次,问如何建工路使得所有点到公路的最长距离最短。分析: 看成是找树上所有点中距离最远的路径,主要是两次广搜,第一次找到一个端点,第二次找到另一个,第二次找的过程中记录路径, 便于最后一次遍历全图找到答案。#include <stdio.h>#include <string.h>#define maxn 100005#define clr(x)memset(x,0,sizeof(x))struct node{ int to, next, w;}q[1000000];int tot;int head[m
阅读全文
摘要:题意: 给出一系列的关系,有“>” "=" "<" 判断给出的关系中是不是有唯一的排序方式,如果没有判断是否有冲突或者是不确定的关系。分析: 这题比较特殊的地方是要处理好“=”关系,把所有的“=”关系用并查集放到一个集合里即可。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define maxn 10005int f[maxn];int find(int x){ return f[x]==x?x:(f[x]=find(f[x
阅读全文
摘要:题意: 有 n 头牛,知道了m 对牛之间的关系,问最少还需要知道多少对牛的关系才能确定所有牛之间的关系。分析:n个节点,共有n*(n-1)/2个对应关系,要确定所有关系即确定这 n*(n-1)/2个对应关系, 对于已经给出的m个关系,用传递闭包求出已经确定的关系总数res, 对于剩下的n*(n-1)/2-total个关系,由传递闭包的性质知:如果节点i和节点j之间的关系不确定,那他们之间在原图中时相对独立的,而每次询问的答案又都是 不确定的,所以需要对于这些关系全部进行询问才能知道全序关系节点数比较多,在传递闭包的时候要用邻接表实现.#include<stdio.h>#includ
阅读全文
摘要:题意:n个点的一棵树,其中有k个敌人所在结点,要破坏一些边使得这 k 个点互不可达,求出破坏边的最小权值和。分析:对于有n个结点的树,删除任意的k (k<=n-1)条边都能将原树分成k+1个部分 按照题意至少需要将原树划分成 k 个部分(此时每部分中都包含一个敌人的点),删除的边数为k-1。 类似kruskal最小生成树的过程,不过此处将边按权值从大到小排列,每次将边加进来时要判断是否会使两个危险的 点连通,是的话这条边就是需要被删除的,否则将它加到树上。#include<stdio.h>#include<string.h>#include<stdlib.h
阅读全文
摘要:题意: 有 n 个电灯泡,知道了每个电灯泡的坐标和覆盖半斤,为最多可以去掉多少电灯泡使得 1,2,3,号电灯泡的灯光任然相连。分析: 分别以 1,2,3为源点求最短路,找到一个点到这三个点的距离和最小值sum,答案即为 n - sum - 1#include<stdio.h>#include<queue>#include<string.h>using namespace std;#define INF 0x1f1f1f1f#define clr(x)memset(x,0,sizeof(x))#define maxn 205struct node{ int t
阅读全文
摘要:题意:找出一个0,1,矩阵分析: 转换思维的题啊,由一道让人不知如何下手的题,转换为了最短路基本思路就是把矩阵看做一个图,图中有n个点,1号点出度为1,n号点入度为1,其它点出度和入度相等,路径长度都是非负数,等价于一条从1号节点到n号节点的路径,故Xij=1表示需要经过边(i,j),代价为Cij。Xij=0表示不经过边(i,j)。注意到Cij非负且题目要求总代价最小,因此最优答案的路径一定可以对应一条简单路径。最终,我们直接读入边权的邻接矩阵,跑一次1到n的最短路即可,记最短路为path。漏了如下的情况B:从1出发,走一个环(至少经过1个点,即不能是自环),回到1;从n出发,走一个环(同理)
阅读全文
摘要:题意: 有 n 个队伍,给出m 个关系,判断是否有环,或者有多种排序方式,或者排序方式唯一。分析:拓扑排序,如果在排序过程中出队的次数超过 N 说明有环,否则如果在同一层入队的有多个,则说明有多种情况。#include<stdio.h>#include<string.h>#include<math.h>#define maxn 10005#define clr(x)memset(x,0,sizeof(x))struct node{ int to,next;}e[1000005];int tot;int head[maxn];void add(int s,in
阅读全文
摘要:题意:给图按黑白着色,求一种着色方案使得图中着黑色的顶点数最多且这些顶点相互之间都不相邻.分析: 求出补图的最大团即为答案。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))#define maxn 111int g[maxn][maxn];int res[maxn];int s[maxn];int sum;int n,m,sn,ans;void dfs(int r){ int i,j; if(r>n) { for(i=1;i<=n;i++) res[...
阅读全文
摘要:题意: 已知一个有 n 个点的五向图,有重边,找出找出一个边集,使得这些边去掉之后原图不连通,并且去掉的边的数目要尽可能的少。分析: 求最小割边集用o(n^3)的stoer-Wagner算法,用最大流会TLE。 算法详解 http://blog.sina.com.cn/s/blog_700906660100v7vb.html#include<cstdio>#include<cstring>#define INF 0x1f1f1f1f#define clr(x)memset(x,0,sizeof(x))#define min(a,b)(a)<(b)?(a):(b)#
阅读全文
摘要:题意: 有一个有n个点的无向图,已知 m 条边,每条边有权值和一个字母标号,字母标号有四种 'L' 'O' 'V' 'E' 要找一条从1点到n点去的一条路径,然后要求有LOVE的的条件下路径最短,如果有多条最短路,找LOVE最多的那条分析: 将每个点分为四个,代表L,LO,LOV, LOVE四种状态#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))const long long inf=1ll<<57;co
阅读全文
摘要:题意: 给出一个地图,要求找出至少经过K条边的最短路,可以走重边。分析:二维最短路,用dis[i][j] 记录 在i 点进过j 条路的最短路 找到dis[i][k]的最小值。SPFA:#include<stdio.h>#include<string.h>#include<queue>#define INF 0x1f1f1f1fusing namespace std;#define maxn 5005struct node{ int to,next,w;}e[200005];int tot;int head[maxn];void add(int s,int u
阅读全文
摘要:题意: 给出一个有N 个节点,和M 条边,这些边分为 蓝色和红色的,问是否存在一种情况为 恰好用 k个蓝色的边,和已有的若干条红色边,将原图连成一棵树。分析: 两次 Kruskal ,第一次的时候先把能用的红色边全部用上,然后用蓝色边,这些用到的蓝色边都是最终的生成树所必需的,将其标记如果发现需要的蓝色边数目大于 K,或用完了能用的蓝色边之后图还未连通,则不存在符合条件的情况 第二次Kruskal的时候,先把之前标记的蓝色边全部用上,然后在剩下的蓝色边选出能用的边,如果总数能达到K则存在符合的情况。#include<stdio.h>#include<string.h>#
阅读全文
摘要:题意:恐怖分子在去年轰炸哈理工未遂后,打算今年卷土重来,学校为了预防恐怖分子潜入主楼,决定在今年9月份在每间教室安装摄像头,恐怖分子为了能够成 功潜入主楼,将要摧毁这些摄像头。 已知摄像头的安装是成网络状的,摄像头的连接是双向的。如果网络中任何两个摄像头之间至少有一条路,则该网络为连通的,否则不连通。一个空的网络 或只有一个摄像头的网络被认为是连通的。如果网络不连通,则导致摄像头主系统瘫痪,恐怖分子会成功潜入主楼。因为摄像头之间的连线是接在墙里的, 所以只能靠摧毁摄像头使网络不连通,做为恐怖分子头目的你,请你计算至少要摧毁多少个摄像头才能让你的手下成功潜入主楼。分析:使得网络不连通所需去除的最
阅读全文
摘要:题意:Colugu市有n个车站和m条路。每条路直接连接两个车站,所有的路都是单向的。为了维护空气质量,政府停用了所有军队车辆。所以军队必须乘坐巴士去机场。两个车站之 间可能不只一条路。如果一个车站被摧毁,那么所有通向那个车站的道路都没用了。Gabiluso需要去做的是摧毁一些车站使得军队不能在k分钟内 赶到机场。一辆巴士通过一条路只需要一分钟。从1到n给所有车站编号。编号为1的车站在军营里,编号为n的车站在机场里。军队总是从编号为1的车站出发 由于有重兵把守,所以编号为1和n的车站不能被摧毁。当然那里没有一条路直接从1号车站连接到n号车站,请帮助Gabiluso计算他需要摧毁车站的最小数量,他
阅读全文
摘要:题意: 给出一个有N个节点的无向图和 M 条边,每条边都有一个重力承受度,要从中找出一条从 1 节点到 n节点的路径,使得可以经过的车辆载重最大。分析:类似于最大流中找增广路,在求最短路的松弛操作上加以修改。SPFA:View Code #include<stdio.h>#include<string.h>#define min(a,b)(a)<(b)?(a):(b)#define clr(x)memset(x,0,sizeof(x))#define INF 0x1f1f1f1fstruct node{ int to,next,w;}e[1000005];int
阅读全文
摘要:题意: 有 N个村庄,和 M 个区域,M个区域是由N个村庄之间的围墙分割而成,如:图中10个村庄间的围墙把地形分成了10 个区域,知道了一些人的所在的村庄的位置,想找一个区域,使得这些人到达这个区域经过的围墙数总和最小,并求出最小值。分析: 要把各个区域看成点,两两区域间的围墙看成边来建图,如果两块区域之间有围墙相隔,那么就在这两个区域之间建一条长度为1 的边, 图建完之后用 FLOYED 求出两两点的最短距离, 计算每个人到达某个区域的最小距离时,要枚举和该人所在村庄相邻的区域。 依次枚举目标区域找出最小值。#include<stdio.h>#include<string.
阅读全文
摘要:题意: 给出一定的大写字母,并依次给出 m 个两两关系,如果在输入关系的过程中发现有环,或已经能确定所有序列的关系,则输出相应的结果,并且以后输入的关系 不会对当前结果产生影响。分析: 如果在输入过程每输入一个进行依次拓扑排序,如果排序中出现没有 0 入度的点则说明有环,如果每次找到的 入度为 0 的点均为一个,并且找到n 个,则顺序 可以被确定。#include<stdio.h>#include<string.h>#define clr(x)memset(x,0,sizeof(x))int g[30][30];int d[30];int res[30];int n;i
阅读全文
摘要:题意: 知道了一个序列a[1]..a[n] ,给出 m 个约束条件,① st sn gt ki 表示a[st]+a[st+1]+..a[st+sn]>ki ② st snlt ki表示a[st]+a[st+1]+..a[st+sn]<ki 问是否存在这样的 a[i] 序列。分析: 将上面的两个不等式等价转换建立差分约束系统 将 ① 变为s[st-1]-s[st+en] < -ki <=-ki-1 将 ② 变为s[st+en]-s[st-1] < ki <=ki-1 求解这个差分约束系统,看最后有无冲突// gt dis[s[i].en]-dis[s[i].s
阅读全文
摘要:题意: 知道了数轴上的n个区间,每个区间都是连续的int区间,现在要在数轴上任意取一堆元素,构成一个元素集合V要求每个区间和元素集合V的交集至少有两个不同的元素 求集合V最小的元素个数。转一分析:(差分约束)设s[x] = 从0 到x 的所有在集合中的数的个数则ai到bi的个数即S[bi] - S[ai-1]。因此有(1) S[bi] - S[ai-1] >= 2。又根据s[x]本身的性质,后面的一定不比前面的小,后面的最多比前面多一,有:(2) s[i + 1] - s[i] >= 0 (3) s[i + 1] - s[i] <= 1故建图,使图中每一组边,均满足(注意三条
阅读全文
摘要:题意: 年轻的探险家来到了一个印第安部落里。在那里他和酋长的女儿相爱了,于是便向酋长去求亲。酋长要他用10000个金币作为聘礼才答应把女儿嫁给他。探险家拿不出这么多金币,便请求酋长降低要求。酋长说:"嗯,如果你能够替我弄到大祭司的皮袄,我可以只要8000金币。如果你能够弄来他的水晶球,那么只要5000金币就行了。"探险家就跑到大祭司那里,向他要求皮袄或水晶球,大祭司要他用金币来换,或者替他弄来其他的东西,他可以降低价格。探险家于是又跑到其他地方,其他人也提出了类似的要求,或者直接用金币换,或者找到其他东西就可以降低价格。不过探险家没必要用多样东西去换一样东西,因为不会得到更
阅读全文


浙公网安备 33010602011771号