随笔分类 -  图算法

摘要:/*题目: 现给出各位选手的能力比较并给出自己的朋友的参赛号码,如何组织比赛使得自己的朋友能够获胜分析: 各选手能力比较可以构造一个有向图,而想要使得自己的朋友要赢得比赛,所以他的所在的连通块 必定是入度为0的(假设建图时是以能力大的人作为边的起点)。所以题目可以转换为先建图,然后 再找连通块求缩点,然后判断该缩点是否入度为0,若有朋友在该连通块中,即可判断可以组织这样 的一场比赛。而判断朋友在不在该连通块中,可以先求到所有的入度为0的连通块用数组置为true, 然后直接把所有朋友的所在的连通块置为false,若所有的连通块中只要还有true的连通块,就可判断 不能组织这样的一场比赛*/#in 阅读全文
posted @ 2012-05-18 16:18 yejinru 阅读(240) 评论(0) 推荐(0) 编辑
摘要:/*题目: 寻找图中的最小环,输出路径。分析: 可以通过枚举删除其中的一条边,看看能否从该边的一点走到另一点,若能并且该最短路的长度加上 删除的边的长度小于当前的最优解的话,更新路径与最优解。而打印路径可以通过数组来表示该点的 前一顶点,然后递归打印路径即可。最短路可以通过dijkstra算法求出。估计的时间复杂度为O(n^2*E)。 我交了一下,用时:1.328 内存:264 KB*/#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int X = 阅读全文
posted @ 2012-04-30 10:03 yejinru 阅读(316) 评论(0) 推荐(0) 编辑
只有注册用户登录后才能阅读该文。
posted @ 2012-04-10 11:34 yejinru 阅读(9) 评论(0) 推荐(1) 编辑
摘要:/*题目: 就是所在矩形中有一些外星人,一些人组队打怪去,可以分很多支队,问这些队一共所需的 最少移动步数分析: 由于可以分很多队,所以可以看做是从起点出发求最小生成树(其实有无起点一样,MST肯定 包括起点),于是问题转换为求最小生成树。怎样处理点与点之间的距离。其实每两个点之间 肯定存在通路,而任两点之间的最小直接距离可以通过bfs求到,于是可以通过枚举所有的点 (即外星人和起点)到另外的点(还是外星人和起点)的距离。具体实现看代码*/#include <iostream>#include <cstring>#include <cstdio>#inclu 阅读全文
posted @ 2012-04-09 22:37 yejinru 阅读(164) 评论(0) 推荐(1) 编辑
摘要:/*题目: 象棋中的车在象棋盘上可以放置的最大数目(若没有挡板的话,在同一行或同一列的车 可以相互攻击,问的是所有的车可以和平地放置的最大数目)分析: 方法一: 可以通过暴搜得到答案(题目数据较小) 方法二: 可以通过构造二分图的方法来做,以下主要分析二分图的解法方法: 我们将每一行,每一列被墙隔开,且包含空地的连续区域称作“块”。显然,在一个块之中, 最多只能放一个车。我们把这些块编上号。 同样,把竖直方向的块也编上号。 把每个横向块看作X部的点,竖向块看作Y部的点,若两个块有公共的空地,则在它们之间连边。 于是,问题转化成这样的一个二部图: .X.. .... XX.. .... 我们可以 阅读全文
posted @ 2012-04-07 19:33 yejinru 阅读(243) 评论(0) 推荐(2) 编辑
摘要:/*题目: 当狼与猪相邻时,狼要吃猪,若狼吃掉一头猪,他不会再吃另一头猪,问狼可以吃掉的猪的最大数目分析: 狼与猪构成二分图,第i头狼能吃掉第j头猪,则g[i][j] = true即可建图,可以先预处理每一头猪和狼 的序号,然后再建图*/#include<cstdio>#include<cstring>#define X 105#define M 11char ch[M][M];intym[X],cal[2][M][M],n,m,nw,np;//int xm[X];booluse[X],g[X][X];bool dfs(int u){ for(int v=1;v< 阅读全文
posted @ 2012-04-07 16:04 yejinru 阅读(198) 评论(0) 推荐(0) 编辑
摘要:/*题目: 当一个洋娃娃的长宽高都比另一个大时,小的那个可以被套进去,问在最外面的洋娃娃的 最小个数分析: 求最大独立集,用娃娃总数-最大匹配即可,用两层循环先建图,每当娃娃i长宽高都比j小时, 则g[i][j] =true建图即可,开始时我竟然先对它进行排序,后来才发现是不用的。。。直接 两层循环再比较即可建图。求最大匹配就是纯粹的hungy算法*/#include<iostream>#include<cstring>#include<cstdio>using namespacestd;#define X 502intxm[X],ym[X],n,m;boo 阅读全文
posted @ 2012-04-07 16:03 yejinru 阅读(406) 评论(0) 推荐(0) 编辑
摘要:/*题目: 每头奶牛喜欢在不同的地方产奶,每个地方只能容纳一头奶牛,问最多的产奶的地方分析: 在产奶地与奶牛之间建立匹配,然后用hungry算法做,比如奶牛a喜欢在q地产奶,则 g[a][q] = true,建图即可*/#include<iostream>#include<cstdio>#include<cstring>using namespacestd;#define X 202intxm[X],ym[X],n,m;boolg[X][X],use[X];int dfs(int u){ for(int v=1;v<=m;v++) if(g[u][v] 阅读全文
posted @ 2012-04-07 16:02 yejinru 阅读(166) 评论(0) 推荐(0) 编辑
摘要:/*题目: 值班问题,给出所有人的空余时间,问能不能够在每一个时间里安排一个人值班分析: 二分匹配问题,按人与他的空余时间连线构图,然后就是hungry算法了,简单*/#include<iostream>#include<cstring>#include<cstdio>using namespacestd;#define X 22boolg[X][X],use[X];intxm[X],ym[X],k,p;bool dfs(int u){ for(int v=0;v<k;v++) if(g[u][v]&&!use[v]) { use[v] 阅读全文
posted @ 2012-04-07 16:00 yejinru 阅读(201) 评论(0) 推荐(0) 编辑
摘要:/*题目: 哈工大推出新的宿舍分配方案,当两人对A B题有相同答案的人可以分在A类宿舍, 对C D题有相同答案的人可以分在B类宿舍,每一间的宿舍人数没有限制的话,问可 以最少要分配多少间宿舍才能分好所有学生分析: 每一个学生都可以分配在A类宿舍i,或者B类宿舍j,因此,g[i][j] = true,由此可以 构造一个二分图,用hungry算法做 由于输入的数据比较大,若用两层循环判断的话,会超时,所以可以先排序,然后再判断 与前面的一不一样,若一样则置g[i][j] = true,i 和 j的值需要先处理好,具体看代码*/#include<iostream>#include< 阅读全文
posted @ 2012-04-07 15:56 yejinru 阅读(184) 评论(0) 推荐(1) 编辑
摘要:/*题目: 很裸的次小生成树题,要求先给出最小生成树的值,若有不连通的输出-1, 接着需要输出次小生成树的值分析: 可以选择prim或kruskal算法做,我的做法是用prim做的,具体看代码注释*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define X 503#define INF 10000000int path[X][X],map[X][X],dis[X],pre[X],n,m;bool use[X],visit[X][X];int prim 阅读全文
posted @ 2012-03-31 18:24 yejinru 阅读(190) 评论(0) 推荐(0) 编辑
摘要:/*有向图的传递闭包问题,只要顶点的入度或出度大于n/2,即可判断它不符合中间点,即答案加一,而求它的入度或出度的话,可以用有向图的传递闭包floyd算法来做,时间复杂度为O(n^3)*/#include <iostream>#include <cstring>#include <cstdio>using namespace std;#define X 100int map[X][X],n,m;void floyd(){ for(int k=1;k<=n;k++) //floyd算法求传递闭包 for(int i=1;i<=n;i++) for( 阅读全文
posted @ 2012-03-29 15:53 yejinru 阅读(210) 评论(0) 推荐(0) 编辑
摘要:#include <iostream>#include <cstdio>#include <string>using namespace std;#define X 305string s;int map[X][X],color[X],n,x,y,len,c,ans;bool check(int a,int col) //检查顶点a的颜色能否涂成col{ for(int i=1;i<=n;i++) if(map[a][i]&&color[i]==col) //相邻节点颜色与他一样,不行 return false; return true 阅读全文
posted @ 2012-03-20 14:41 yejinru 阅读(224) 评论(0) 推荐(0) 编辑
摘要:编辑器加载中.../*题目: 问周游一圈后能不能换钱得到利润分析: 有向图是否处在负环问题,因为涉及每个顶点都可能存在负环, 直接用flord算法做即可*/#include <iostream>#include <string>#include <cstring>using namespace std;#define X 35string city[X],s1,s2;double map[X][X];int main(){ freopen("sum.in","r",stdin); freopen("sum.o 阅读全文
posted @ 2012-03-20 14:40 yejinru 阅读(183) 评论(0) 推荐(0) 编辑
摘要:题目: 给出邮递员每天要走的路线,要你求出最小的消耗分析: 注意每一个字符串如three,表示邮递员起始于t,要走到e,而此时所消耗为字符串的长度, 你要确定跑遍所有这些街道所需的最小旅程。旅程结束时必须回到起点的路口。注意到题目给出 奇数度的顶点不超过两个,就是说有且只有两个,或者一个没有,所以根据欧拉回路可知,如果 没有奇数顶点的话,直接输出所输入的总字符串长度即可。如果有两个奇数顶点的话,还要加上 两个顶点之间的距离,就是说可能要求任意两顶点之间的距离,涉及到题目的输入规模最大不过为 26,用floyd算法即可O(n^3)#include <iostream>#include 阅读全文
posted @ 2012-03-15 20:47 yejinru 阅读(234) 评论(0) 推荐(0) 编辑
摘要:题目:给出两个顶点并且给出两个顶点之间的概率,求从1到n的最大的概率分析:纯粹是dijkstra算法,只不过把最短路径改动一下而已要先定义dp[n]=1;后面的直接套用dijkstra模板,把min部分改为max即可,并且之前加的部分改为相乘即可dijkstra模板:设图由邻接矩阵g存储。memset(dist,0x3f,sizeof(dist));memset(used,false,sizeof(used));dist[0]=0;//设0为源点for(i=0;i<n;i++)//循环n次{min=10000000;for(j=0;j<n;j++)//找到最小值if(!used[j 阅读全文
posted @ 2012-02-29 22:31 yejinru 阅读(154) 评论(0) 推荐(0) 编辑
摘要:题目:岛上的居民要修最短的路来使得费用最少分析:实际上是求最小生成树,可以用prim算法和kruskal算法,基于刚学kruskal算法,以下是用kruskal算法做的。kruskal算法的思想是:先把所有的边按照非降序排列,从而观察每条边是否能与以前的边组成环,能的话就不选,不能的话就选择,而判断是否组成环路的话可以通过使用并查集实现并查集的思想是:{1,2,3},{4,5},{6,7,8},{9},当该边是当前最少的边时,两端顶点为1,4,因为1,4在两个不同的集合中,故而不能组成回路,假设在同一集合中,如1和2,因为前面肯定1,2,3能直接或间接相连接,加入边(1,2)可定能使该图组成环 阅读全文
posted @ 2012-02-29 22:23 yejinru 阅读(221) 评论(0) 推荐(1) 编辑
摘要:题目:有s个satellite channels,但有p(p>s)个地方,若任意两个地方有satellite channels,则无视该距离,并且剩余的地方只能与其他地方通过无线电连接,需要距离,且需要的距离只与最大距离有关,问该最大距离的最小值(大概是这样啦)分析:实际上就是求最小生成树中的第p-s大的数,可以先通过prim算法生成最小生成树,然后通过对生成树中的边进行快速排序,得到第p-s大的数#include <iostream>#include <cstring>#include <cstdio>#include <algorithm&g 阅读全文
posted @ 2012-02-29 22:22 yejinru 阅读(259) 评论(0) 推荐(0) 编辑
摘要:题目:问那个人可以走完所有的城市的最大承载量是多少分析:求最大生成树的边的最小值,可以用dijkstra算法变形做,相当于把求最小值改为求最大值,只需把dist初始化为0,并且min处改为max = -1,注意到可能为0,再改动其他地方就行,详细看代码。。。设图由邻接矩阵g存储。memset(dist,0x3f,sizeof(dist));memset(used,false,sizeof(used));dist[0]=0;//设0为源点for(i=0;i<n;i++)//循环n次{min=10000000;for(j=0;j<n;j++)//找到最小值if(!used[j]& 阅读全文
posted @ 2012-02-29 22:19 yejinru 阅读(131) 评论(0) 推荐(0) 编辑
摘要:Tangled in CablesYou are the owner of SmallCableCo and have purchased the franchise rights for a small town. Unfortunately, you lack enough funds to start your business properly and are relying on parts you have found in an old warehouse you bought. Among your finds is a single spool of cable and a 阅读全文
posted @ 2012-02-29 22:11 yejinru 阅读(215) 评论(0) 推荐(0) 编辑