迪杰斯特拉(Dijkstra)算法求图的单源最短路径
template<class Type>
void Dijkstra(int n, int v, Type dist[], int prev[], Type **c) {
//单源最短路径问题的 Dijkstra 算法
bool s[maxint];
for (int i = 1; i <= n; i++) {
dist[i] = c[v][i];
s[i] = false;
if (dist[i] == maxint) prev[i] = 0;
else prev[i] = v;
}
dist[v] = 0; s[v] = true;
for (int i = 1; i < n; i++) {
int temp = maxint;
int u = v;
for (int j = 1; j <= n; j++)
if (!s[j] && dist[j] < temp) {
u = j;
temp = dist[j];
}
s[u] = true;
for (int j = 1; j <= n; j++)
if (!s[j] && c[i][j] < maxint) {
Type newdist = dist[u] + c[u][j];
if (newdist < dist[j]) {
dist[j] = newint;
prev[j] = u;
}
}
}
}
如果还没解决你的问题,可以加我网络HI账号。
2. 枚举算法,VB表达式
PrivateSubCommand1_Click()
DimcAsInteger,nAsInteger,jAsInteger
c=0
j=0
DoWhilej<100
n=25006+j*10
IfnMod37=0OrnMod67=0Then
c=c+1
List1.AddItem"第"&Str(c)&"数字是"&Str(n)
Else
EndIf
j=j+1
Loop
List1.AddItemStr(c)
EndSub
虽然帖子很久了但是,还是补充个完整的
3. 这是解析算法还是枚举算法
是解析算法吧:
解析法(analysis algorithm):用解析的方法,即找出表示问题的前提条件与结果之间关系的数学表达式,并通过表达式的计算来实现问题求解的方法。
枚举的定义:根据所需解决问题的条件,把该问题所有可能的解,一一列举出来,并逐个检验出问题真正解的方法。枚举法也称为穷举法。
4. 硬币问题采用枚举思想,该枚举算法的思路大概描述一下
这个还是可以考虑的,因为为什么呀,因为这个描述下还是大概意思就行,然后自己好好想想那个。
5. 关于算法的基础知识 解析算法和枚举算法有什么区别
所谓解析法(analysis algorithm)是指用解析的方法找出表示问题的前提条件与结果之间关系的数学表达式,并通过表达式的计算来实现问题求解.
在实际问题中,有些变量的取值被限定在一个有限的范围内.例如,一个星期内只有七天,一年只有十二个月,一个班每周有六门课程等等.如果把这些量说明为整型,字符型或其它类型显然是不妥当的.为此,C语言提供了一种称为“枚举”的类型.在“枚举”类型的定义中列举出所有可能的取值,被说明为该“枚举”类型的变量取值不能超过定义的范围.应该说明的是,枚举类型是一种基本数据类型,而不是一种构造类型,因为它不能再分解为任何基本类型.
6. 枚举算法的介绍
在实际问题中, 有些变量的取值被限定在一个有限的范围内。例如,一个星期内只有七天,一年只有十二个月, 一个班每周有六门课程等等。如果把这些量说明为整型, 字符型或其它类型显然是不妥当的。 为此,C语言提供了一种称为“枚举”的类型。在“枚举”类型的定义中列举出所有可能的取值, 被说明为该“枚举”类型的变量取值不能超过定义的范围。应该说明的是, 枚举类型是一种基本数据类型,而不是一种构造类型, 因为它不能再分解为任何基本类型。
7. 搜索算法和枚举算法的区别是什么
枚举是在范围内查找所有可能解,不是找到就结束;
顺序查找是假设在数组范围内找key,找到就结束,不一定到数据结束。也就是,如果数组中的第一个数据就是我们要找的key,那么找到了,不再继续找第2个。
8. 枚举算法的使用
枚举类型在使用中有以下规定:
枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值。例如对枚举weekday的元素再作以下赋值: sun=5;mon=2;sun=mon; 都是错误的。
枚举元素本身由系统定义了一个表示序号的数值,从0 开始顺序定义为0,1,2…。如在weekday中,sun值为0,mon值为1, …,sat值为6。
例如:
#include<stdio.h>
int main()
{
enum weekday{sun,mon,tue,wed,thu,fri,sat };
weekday a,b,c; //将a,b,c定义为枚举变量
a=sun;
b=mon;
c=tue;
printf(%d,%d,%d,a,b,c);
return 0;
}
运行结果为:0,1,2
枚举值也可以用来做判断比较。如:if(mon>sun) …
枚举变量的值可以由程序员自己定。如:
enum weekday{sun=7,mon=1,tue,wed,thu,fri,sat};
定义sun为7,mon为1,以后按顺序加1,即wed=3。
9. 枚举算法的说明
如同结构和联合一样,枚举变量也可用不同的方式说明, 即先定义后说明,同时定义说明或直接说明。设有变量a,b,c被说明为上述的weekday,可采用下述任一种方式:
enum weekday
{
......
};
enum weekday a,b,c;或者为: enum weekday
{
......
}a,b,c;或者为: enum
{
......
}a,b,c;
10. 什么是枚举法
枚举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。
基本信息
中文名:枚举法
外文名:Enumeration method
定义:逐个考察了某类事件的所有可能
借助:计算机运算速度快精确度高特点
结构:while循环
算法:二进制加法,此时需要数组来帮忙
简介
枚举法是利用计算机运算速度快、精确度高的特点,对要解决问题的所有可能情况,一个不漏地进行检验,从中找出符合要求的答案,因此枚举法是通过牺牲时间来换取答案的全面性。
在 数学和 计算机科学理论中,一个集的 枚举是列出某些有穷序列集的所有成员的 程序,或者是一种特定类型对象的 计数。这两种类型经常(但不总是)重叠。
特点
将问题的所有可能的答案一一 列举,然后根据条件判断此答案是否合适,合适就保留,不合适就丢弃。例如:找出1到100之间的素数,需要将1到100之间的所有 整数进行判断。
枚举算法因为要列举问题的所有可能的答案,所有它具备以下几个特点:
1、得到的结果肯定是正确的;
2、可能做了很多的无用功,浪费了宝贵的时间,效率低下。
3、通常会涉及到求 极值(如最大,最小,最重等)。
4、数据量大的话,可能会造成时间崩溃。
结构
枚举算法的一般结构:while 循环。
首先考虑一个问题:将1到100之间的所有整数转换为 二进制数表示。
算法一
for i:=1 to 100 do begin
将i转换为 二进制,采用不断除以2, 余数即为转换为2进制以后的结果。一直除商为0为止。
end;
算法二
二进制加法,此时需要数组来帮忙。
program p;
var a:array[1..100] of integer; {用于保存转换后的二进制结果}
i,j,k:integer;
begin
fillchar(a,sizeof(a),0); {100个数组元素全部初始化为0}
for i:=1 to 100 do begin
k:=100;
while a[k]=1 do dec(k); {找高位第一个为0的位置}
a[k]:=1; {找到了立刻赋值为1}
for j:=k+1 to 100 do a[j]:=0; {它后面的低位全部赋值为0}
k:=1;
while a[k]=0 do inc(k); {从最高位开始找不为0的位置}
write('(',i,')2=');
for j:=k to 100 do write(a[j]); {输出转换以后的结果}
writeln;
end;
end.
枚举法,常常称之为 穷举法,是指从可能的集合中一一枚举各个元素,用题目给定的约束条件判定哪些是无用的,哪些是有用的。能使命题成立者,即为问题的解。