上一页 1 ··· 15 16 17 18 19
摘要: 已知一个无向图,有村庄节点a个,有城堡节点b个,1到a表示村庄,a+1到a+b表示城堡,求第一个村庄节点到最后一个城堡节点的最短距离。如果某一段路径长度小于等于L且中间经过的节点(不包括两端)均是村庄类型,则可以穿一种神奇的靴子瞬间移动到那里,靴子只能在节点上使用或停止,靴子只能用K次设共n个节点,对于如何使用这k次机会是一个动态规划问题,dp[ i ][ j ]表示从村庄1经过标号小于i的路径并使用j次穿靴子的机会到达点i的最短距离,则dp[n ][k ]为该问题最终结果,则状态转移方程为dp[ i ][ j ] = min( min ( dp[ k ][ j-1 ],dp[ k ][ j 阅读全文
posted @ 2013-08-13 21:31 贝尔摩德 阅读(161) 评论(0) 推荐(0) 编辑
摘要: 题目大意是,即成语接龙,输入一些成语,每个成语有一个时间t,表示若选择了该成语,则需要时间t才能找到下一个能接上的成语,问从第一个输入的成语走到最后一个输入的成语需要多长时间。将每个成语当做一个节点建图后,即最短路径问题,从节点i到节点j的时间即i的t。#include #include #define INF 50000int map[1010][1010],dist[1010],vis[1010],n;struct idiom{ char front[5],back[5]; int t;}dic[1010];void dij(int u){ memset(vis,0,sizeof(vis) 阅读全文
posted @ 2013-08-11 15:41 贝尔摩德 阅读(159) 评论(0) 推荐(0) 编辑
摘要: 1.对于最小生成树的任何一条边e,将它去掉后形成两个集合u和v,则e是u,v两集合间所有边中最小的(假设不是,则可以把e去掉换成一条更小的边,从而形成一棵更小的生成树,矛盾)2.在最小生成树中的第K长边是所有生成树中第K长边的最短边。设该边为e,将它去掉后形成两个集合u和v,若是生成树,那么在u和v间一定有边,所以加上一条边要比e大,此时将新生成树的边排序,在最小生成树中比e大的边有k-1条,加上新添的,比e大的一共有k条,所以新生成树中第K长边大于e。3.次小生成树可由最小生成树换一条边得到 证法一 :可以证明下面一个更强的结论:T是一棵最小生成树,T0是一棵异于T的树,通过变换 T0 -- 阅读全文
posted @ 2013-08-11 14:27 贝尔摩德 阅读(164) 评论(0) 推荐(0) 编辑
摘要: 二分思想真的是无所不在,即使在中文系的专业课中我们也能见到这个词。在语言学概论中我们提到,一个音位可以由一组区别特征确定下来,这些区别特征总是以只具有“是/否”、“有/无”等两种对立属性的“二元偶分组”形式存在,因为这样可以最方便最快捷地确定出一个元素。这有点像猜数字一样,我想一个数字后让你来猜,我告诉你你的猜测是大了还是小了。只是在这里,回馈的信息不再是大小,而是“辅音/元音”、“口音/鼻音”、“浊音/清音”、“送气/不送气”等形式逐层细分。这让人联想到5张卡片猜年龄的老把戏,一系列火星的称球问题,基于比较的排序算法的复杂度下界,或者经典的20q在线游戏。 一个有趣的事实是,相当多的人都错误 阅读全文
posted @ 2013-08-10 21:46 贝尔摩德 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 题目大意是判断一个图的最小生成树是否唯一求出次小生成树,若次小生成树的权值不等于最小生成树,则唯一,若相等,则不唯一#include #include int map[110][110],max[110][110],p[110],low[110],n,m,vis[110][110]; /*max[i][j]表示最小生成树中从i到j的路径中最长的边,map是边,p[i]是prim每次选进去的边一个节点(在之前选进去的集合中的节点)vis[i][j]若为0,表示i到j无边,等于一表示有边但未选入最小生成树,等于2表示选入了最小生成树*/int MAX(int a,int b){ if(a>b 阅读全文
posted @ 2013-08-09 13:27 贝尔摩德 阅读(135) 评论(0) 推荐(0) 编辑
摘要: 题意就是要求最小生成树,用的kruskal#include #include int p[30],n,x1;struct edge{ int u,v,w;}ed[100];int get(int x){ if(p[x]==x) return x; else return p[x]=get(p[x]);}void uni(int x,int y){ int p1,p2; p1=get(x); p2=get(y); if(p1!=p2) p[p1]=p2;}int cmp(const void *a,const void *b){ edge aa=*(const edge *)a; edge... 阅读全文
posted @ 2013-08-09 10:13 贝尔摩德 阅读(203) 评论(0) 推荐(0) 编辑
摘要: 题目大意是输入一个数N,输出N的N次方的个位,N非常大,直接算会非常慢,所以用二分求幂,即分治,和二分查找思想类似,几乎每次将规模缩小一半,将复杂度由O(n)降到了O(logn),另外,n*n%m=(n%m)*(n%m)%m#include __int64 pow(__int64 n,__int64 m){ __int64 u; if(m==1) return n%10; if(m%2==0) { u=pow(n,m/2)%10; return u*u%10; } else { u=u=pow(n... 阅读全文
posted @ 2013-08-07 16:00 贝尔摩德 阅读(151) 评论(0) 推荐(0) 编辑
摘要: 题目大意是将集线器连起来成一棵树,且最长的边必须是所有方案中最小的。对于一个图的最小生成树来说,它的最大边满足在所有生成树的最大边里最小。因为去掉最小生成树的最长边后形成两个集合,无论是什么样的生成树都必须要在这两个集合间有边,而刚刚去掉的那条边正是这两个集合间最短的(否则可以换成一条更短的形成一棵更小的生成树,矛盾),所以直接求最小生成树即可。#include #include int p[1010],n,m,max,sum,ans[15010][2];struct edge{ int u,v,w;}ed[15010];int cmp(const void *a,const void *b) 阅读全文
posted @ 2013-08-07 14:44 贝尔摩德 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 主要思路就是先把已存在的道路用并查集并起来,再将排序后的且不存在的边遍历一遍,若边的两顶点不在一个集合内,则将两顶点并起来且将费用cost加上该边的权值另外在网上看到另一种好的思路就是将已存在的边的权值置为0,然后进直接用最小生成树算法#include #include #include using namespace std;int p[105],n,m;struct edge{ int u,v,w; int flag;}ed[5000];int get(int x){ if(p[x]==x) return x; else return p... 阅读全文
posted @ 2013-08-07 14:09 贝尔摩德 阅读(137) 评论(0) 推荐(0) 编辑
上一页 1 ··· 15 16 17 18 19