算法Word文件下载.docx
- 文档编号:20263794
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:27
- 大小:22.46KB
算法Word文件下载.docx
《算法Word文件下载.docx》由会员分享,可在线阅读,更多相关《算法Word文件下载.docx(27页珍藏版)》请在冰豆网上搜索。
for(intj=0;
j<
++j)//s编号不一定就是0,鄙视思维定势
if(!
isUnion[j]&
&
d[j]<
min)
min=d[j];
t=j;
isUnion[t]=true;
//更新t相邻点的值
for(intk=0;
k<
++k)
if(p[t][k]!
isUnion[k]&
d[k]>
d[t]+p[t][k])
d[k]=d[t]+p[t][k];
path[k]=t;
}//for
}//shortestPath()
/**打印all路径*/
voidprintPath(intpath[],intn,intd[])
intj=i;
printf("
到达顶点%d的最短长度和路径分别是:
%d\n"
i,d[i]);
%d"
i);
while(path[j]!
=-1)
<
--"
);
path[j]);
j=path[j];
\n"
}
/**测试*/
intmain()
ints;
intd[8],path[8];
intw[8][8]={
{10,1,10,10,10,4,4,10},
{10,10,9,10,10,2,10,10},
{10,10,10,1,10,10,10,10},
{10,10,10,10,10,10,10,10},
{10,10,2,5,10,10,10,10},
{10,10,6,10,3,10,3,4},
{10,10,10,10,10,10,10,7},
{10,10,10,3,1,10,10,10}
};
输入起点:
\n"
scanf("
&
s);
//call1
shortestPath(w,8,d,path,s);
//call2
printPath(path,8,d);
//display
system("
pause"
}
Dijkstra算法--c++源代码
/***********************************************
设G=(V,E)是一个每条边都有非负长度的有向图,有一个特异的顶点s称为缘。
单源最短路径问题,或者称为最短路径问题,是要确定从s到V中没一个其他
顶点的距离,这里从顶点s到x的距离定义为从s到x的最短路径问题。
这个问题
可以用Dijkstra算法解决。
下面我给我了c++下的源代码!
************************************************/
iostream.h>
voidmain()
{
intinfinity=100,j,i,n,k,t,**w,*s,*p,*d;
cout<
<
"
inputthevalueofn:
;
cin>
>
endl;
d=newint[n];
s=newint[n];
p=newint[n];
w=newint*[n];
for(i=0;
i<
i++){w[i]=newint[n];
i++)
for(j=0;
j<
j++)
w[i][j];
for(s[0]=1,i=1;
s[i]=0;
d[i]=w[0][i];
if(d[i]<
infinity)p[i]=0;
elsep[i]=-1;
for(i=1;
t=infinity;
k=1;
for(j=1;
if((!
s[j])&
(d[j]<
t)){t=d[j];
k=j;
s[k]=1;
//pointkjointheS
for(j=1;
(d[j]>
d[k]+w[k][j]))
{d[j]=d[k]+w[k][j];
p[j]=k;
从源点到其它顶点的最短距离依次如下:
i++)cout<
d[i]<
"
/*********
顶点个数用n表示,这里给出的例子n=6
100112100100100
10010093100100
1001001001005100
10010041001315
1001001001001004
100100100100100100
具体例子见电子工业出版社《算法设计技巧与分析》148页
关于最短路径的优化问题编程matlab
functionlen=dijkstra(Input)
%最短路Dijkstra算法,同时给出路径,input为图矩阵
row=size(Input,1);
%赋初值
%s_path=1;
distance=inf*ones(1,row);
distance
(1)=0;
%flag
(1)=1;
temp=1;
%求起点到各点的最短路的权
%s_path=ones(1,3);
whilelength(s_path)<
row
pos=find(Input(temp,:
)~=inf);
n=length(pos);
flag=ones(1,n);
fori=1:
n
if(isempty(find(s_path==pos(i),1)))&
(distance(pos(i))>
...
(distance(temp)+Input(temp,pos(i))))
distance(pos(i))=distance(temp)+Input(temp,pos(i));
flag(pos(i))=temp;
end
k=inf;
if(isempty(find(s_path==i,1)))&
(k>
distance(i))
k=distance(i);
temp_2=i;
s_path=[s_path,temp_2];
temp=temp_2;
end
%用追溯法得到起点到各点的最短路的路线
len=zeros(1,row);
forendpoint=1:
path=0;
%初始化
path
(1)=endpoint;
i=1;
whilepath(i)~=1
path(i+1)=flag(path(i));
i=i+1;
path(i)=1;
path=path(end:
-1:
1);
%最短路径
short_distance=distance(endpoint);
%最短路径权
len(endpoint)=short_distance;
%起点到各点的最短距离
pathall{endpoint}=path;
%总路径矩阵
len=len(25:
end);
%{
disp('
起点到各点的最短路径:
'
celldisp(pathall);
%设法只画出最短路径
em=find(w==inf);
w(em)=0;
h=view(biograph(w,[],'
ShowWeights'
'
on'
));
%}
Dijkstra算法Dijkstra算法是典型最短路算法,用于计算一个节点到其他所有节点的最短路径。
主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。
Dijkstra算法能得出最短路径的最优解,但由于它遍历计算的节点很多,所以效率低。
Dijkstra算法是很有代表性的最短路算法,在很多专业课程中都作为基本内容有详细的介绍,如数据结构,图论,运筹学等等。
Dijkstra一般的表述通常有两种方式,一种用永久和临时标号方式,一种是用OPEN,CLOSE表方式,Drew为了和下面要介绍的A*算法和D*算法表述一致,这里均采用OPEN,CLOSE表的方式。
其采用的是贪心法的算法策略
大概过程:
创建两个表,OPEN,CLOSE。
OPEN表保存所有已生成而未考察的节点,CLOSED表中记录已访问过的节点。
1.访问路网中距离起始点最近且没有被检查过的点,把这个点放入OPEN组中等待检查。
2.从OPEN表中找出距起始点最近的点,找出这个点的所有子节点,把这个点放到CLOSE表中。
3.遍历考察这个点的子节点。
求出这些子节点距起始点的距离值,放子节点到OPEN表中。
4.重复第2和第3步,直到OPEN表为空,或找到目标点。
算法实现
#include<
fstream>
#defineMaxNum765432100
usingnamespacestd;
ifstreamfin("
Dijkstra.in"
ofstreamfout("
Dijkstra.out"
intMap[501][501];
boolis_arrived[501];
intDist[501],From[501],Stack[501];
intp,q,k,Path,Source,Vertex,Temp,SetCard;
intFindMin()
intp,Temp=0,Minm=MaxNum;
for(p=1;
p<
=Vertex;
p++)
if((Dist[p]<
Minm)&
(!
is_arrived[p]))
Minm=Dist[p];
Temp=p;
returnTemp;
intmain()
memset(is_arrived,0,sizeof(is_arrived));
fin>
Source>
Vertex;
for(q=1;
q<
q++)
Map[p][q];
if(Map[p][q]==0)Map[p][q]=MaxNum;
Dist[p]=Map[Source][p];
if(Dist[p]!
=MaxNum)
From[p]=Source;
else
From[p]=p;
is_arrived[Source]=true;
SetCard=1;
do
Temp=FindMin();
if(Temp!
=0)
SetCard=SetCard+1;
is_arrived[Temp]=true;
if((Dist[p]>
Dist[Temp]+Map[Temp][p])&
Dist[p]=Dist[Temp]+Map[Temp][p];
From[p]=Temp;
else
while(SetCard!
=Vertex);
if(p!
=Source)
fout<
========================\n"
Source:
Source<
\nTarget:
p<
'
\n'
if(Dist[p]==MaxNum)
Distance:
Infinity\n"
Path:
NoWay!
Dist[p]<
k=1;
Path=p;
while(From[Path]!
=Path)
Stack[k]=Path;
Path=From[Path];
k=k+1;
Source;
for(q=k-1;
q>
=1;
q--)
-->
Stack[q];
\n========================\n\n"
fin.close();
fout.close();
return0;
SampleInput
2
7
00205030000000
20002500007000
50250040255000
30004000550000
00002555001000
00705000100000
00000000000000
SampleOutput
========================
Source:
2
Target:
1
Distance:
20
Path:
2-->
3
25
4
50
1-->
5
3-->
6
60
5-->
7
Infinity
示例程序及相关子程序:
voidDijkstra(intn,int[]Distance,int[]iPath)
intMinDis,u;
inti,j;
//从邻接矩阵复制第n个顶点可以走出的路线,就是复制第n行到Distance[]
for(i=0;
VerNum;
i++)
Distance=Arc[n,i];
Visited=0;
}//第n个顶点被访问,因为第n个顶点是开始点
Visited[n]=1;
//找到该顶点能到其他顶点的路线、并且不是开始的顶点n、以前也没走过。
//相当于寻找u点,这个点不是开始点n
u=0;
MinDis=No;
for(j=0;
j++)
if(Visited[j]==0&
(Distance[j]<
MinDis))
MinDis=Distance[j];
u=j;
//如范例P1871图G6,Distance=[No,No,10,No,30,100],第一次找就是V2,所以u=2
//找完了,MinDis等于不连接,则返回。
这种情况类似V5。
if(MinDis==No)return;
//确立第u个顶点将被使用,相当于Arc[v,u]+Arc[u,w]中的第u顶点。
Visited[u]=1;
//寻找第u个顶点到其他所有顶点的最小路,实际就是找Arc[u,j]、j取值在[0,VerNum]。
//如果有Arc[i,u]+Arc[u,j]<
Arc[i,j],则Arc[i,j]=Arc[i,u]+Arc[u,j]<
Arc[i,j]
//实际中,因为Distance[]是要的结果,对于起始点确定的情况下,就是:
//如果(Distance[u]+Arc[u,j])<
=Distance[j]则:
//Distance[j]=Distance[u]+Arc[u,j];
//而iPath[]保存了u点的编号;
//同理:
对新找出的路线,要设置Visited[j]=0,以后再找其他路,这个路可能别利用到。
例如V3
if(Visited[j]==0&
Arc[u,j]<
No&
u!
=j)
if((Distance[u]+Arc[u,j])<
=Distance[j])
Distance[j]=Distance[u]+Arc[u,j];
Visited[j]=0;
iPath[j]=u;
//辅助函数
voidPrim()
inti,m,n=0;
T=newTreeNode();
T.Text=V;
Visited[n]++;
listBox1.Items.Add(V[n]);
while(Visit()>
0)
if((m=MinAdjNode(n))!
=-1)
T[n].Nodes.Add(T[m]);
n=m;
n=MinNode(0);
if(n>
0)T[Min2].Nodes.Add(T[Min1]);
treeView1.Nodes.Add(T[0]);
voidTopoSort()
inti,n;
listBox1.Items.Clear();
StackS=newStack();
for(i=VerNum-1;
i>
=0;
i--)
if(InDegree(i)==0)
S.Push(i);
Visited++;
while(S.Count!
n=(int)S.Pop();
ClearLink(n);
if(Visited==0&
InDegree(i)==0)
voidAOETrave(intn,TreeNodeTR,intw)
inti,w0;
if(OutDegree(n)==0)return;
if((w0=Arc[n,i])!
listBox1.Items.Add(V+"
\t"
+(w+w0).ToString()+"
+i.ToString()+"
+n.ToString());
TreeNodeT1=newTreeNode();
T1.Text=V+"
[W="
]"
TR.Nodes.Add(T1);
AOETrave(i,T1,w+w0);
voidAOE()
inti,w=0,m=1;
T1.Text=V[0];
listBox1.Items.Add("
双亲表示法显示这个生成树:
V\tW\tID\tPID"
if((w=Arc[0,i])!
+w.ToString()+"
\t0"
TreeNodeT2=newTreeNode();
T2.Text=V+"
AOETrave(i,T2,w);
T1.Nodes.Add(T2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法