导航:首页 > 源码编译 > 人群搜索算法的实现源代码

人群搜索算法的实现源代码

发布时间:2022-07-31 11:01:30

❶ 数据挖掘源代码

基本Kmeans算法实现 C++代码

#include<iostream>
#include<sstream>
#include<fstream>
#include<vector>
#include<math.h>
#include<stdlib.h>
#definek3//簇的数目
usingnamespacestd;
//存放元组的属性信息
typedefvector<double>Tuple;//存储每条数据记录

intdataNum;//数据集中数据记录数目
intdimNum;//每条记录的维数

//计算两个元组间的欧几里距离
doublegetDistXY(constTuple&t1,constTuple&t2)
{
doublesum=0;
for(inti=1;i<=dimNum;++i)
{
sum+=(t1[i]-t2[i])*(t1[i]-t2[i]);
}
returnsqrt(sum);
}

//根据质心,决定当前元组属于哪个簇
intclusterOfTuple(Tuplemeans[],constTuple&tuple){
doubledist=getDistXY(means[0],tuple);
doubletmp;
intlabel=0;//标示属于哪一个簇
for(inti=1;i<k;i++){
tmp=getDistXY(means[i],tuple);
if(tmp<dist){dist=tmp;label=i;}
}
returnlabel;
}
//获得给定簇集的平方误差
doublegetVar(vector<Tuple>clusters[],Tuplemeans[]){
doublevar=0;
for(inti=0;i<k;i++)
{
vector<Tuple>t=clusters[i];
for(intj=0;j<t.size();j++)
{
var+=getDistXY(t[j],means[i]);
}
}
//cout<<"sum:"<<sum<<endl;
returnvar;

}
//获得当前簇的均值(质心)
TuplegetMeans(constvector<Tuple>&cluster){

intnum=cluster.size();
Tuplet(dimNum+1,0);
for(inti=0;i<num;i++)
{
for(intj=1;j<=dimNum;++j)
{
t[j]+=cluster[i][j];
}
}
for(intj=1;j<=dimNum;++j)
t[j]/=num;
returnt;
//cout<<"sum:"<<sum<<endl;
}

voidprint(constvector<Tuple>clusters[])
{
for(intlable=0;lable<k;lable++)
{
cout<<"第"<<lable+1<<"个簇:"<<endl;
vector<Tuple>t=clusters[lable];
for(inti=0;i<t.size();i++)
{
cout<<i+1<<".(";
for(intj=0;j<=dimNum;++j)
{
cout<<t[i][j]<<",";
}
cout<<") ";
}
}
}

voidKMeans(vector<Tuple>&tuples){
vector<Tuple>clusters[k];//k个簇
Tuplemeans[k];//k个中心点
inti=0;
//一开始随机选取k条记录的值作为k个簇的质心(均值)
srand((unsignedint)time(NULL));
for(i=0;i<k;){
intiToSelect=rand()%tuples.size();
if(means[iToSelect].size()==0)
{
for(intj=0;j<=dimNum;++j)
{
means[i].push_back(tuples[iToSelect][j]);
}
++i;
}
}
intlable=0;
//根据默认的质心给簇赋值
for(i=0;i!=tuples.size();++i){
lable=clusterOfTuple(means,tuples[i]);
clusters[lable].push_back(tuples[i]);
}
doubleoldVar=-1;
doublenewVar=getVar(clusters,means);
cout<<"初始的的整体误差平方和为:"<<newVar<<endl;
intt=0;
while(abs(newVar-oldVar)>=1)//当新旧函数值相差不到1即准则函数值不发生明显变化时,算法终止
{
cout<<"第"<<++t<<"次迭代开始:"<<endl;
for(i=0;i<k;i++)//更新每个簇的中心点
{
means[i]=getMeans(clusters[i]);
}
oldVar=newVar;
newVar=getVar(clusters,means);//计算新的准则函数值
for(i=0;i<k;i++)//清空每个簇
{
clusters[i].clear();
}
//根据新的质心获得新的簇
for(i=0;i!=tuples.size();++i){
lable=clusterOfTuple(means,tuples[i]);
clusters[lable].push_back(tuples[i]);
}
cout<<"此次迭代之后的整体误差平方和为:"<<newVar<<endl;
}

cout<<"Theresultis: ";
print(clusters);
}
intmain(){

charfname[256];
cout<<"请输入存放数据的文件名:";
cin>>fname;
cout<<endl<<"请依次输入:维数样本数目"<<endl;
cout<<endl<<"维数dimNum:";
cin>>dimNum;
cout<<endl<<"样本数目dataNum:";
cin>>dataNum;
ifstreaminfile(fname);
if(!infile){
cout<<"不能打开输入的文件"<<fname<<endl;
return0;
}
vector<Tuple>tuples;
//从文件流中读入数据
for(inti=0;i<dataNum&&!infile.eof();++i)
{
stringstr;
getline(infile,str);
istringstreamistr(str);
Tupletuple(dimNum+1,0);//第一个位置存放记录编号,第2到dimNum+1个位置存放实际元素
tuple[0]=i+1;
for(intj=1;j<=dimNum;++j)
{
istr>>tuple[j];
}
tuples.push_back(tuple);
}

cout<<endl<<"开始聚类"<<endl;
KMeans(tuples);
return0;
}

❷ 《数据结构》算法实现与分析高一凡中的源代码要怎么用

这个代码可以直接用。用的时候必须把include中的文件也保存好。

❸ 禁忌搜索算法源代码

禁忌搜索法:使用一个禁忌表,记录下不允许搜索的元素。在后面的搜索中,根据禁忌表来决定如何处理当前元素。用在约瑟夫环中,我们可以用一个数组记录下已经出圈的人的编号,这样再数数时,可以根据禁忌表来判断此人是否还在圈内。

#define N 100
void yuesefu1(int data[],int result[],int sum,int k)
{
int i=0,j=0,count=0;
int n;
while(count<sum)
{
for(n=0;n<count;n++)/*根据禁忌表判断此人是否还在圈内*/
if(result[n]==data[i])
break;
if(n>=count)/*若此人还在圈内*/
j++;
if(j==k)
{
result[count++]=data[i];/*把出圈的人的编号存入禁忌表*/
j=0;
}
i++;
if(i==sum)
i=0;
}
}

void main()
{
int data[N];
int result[N]={0};
int i,j,total,k;
printf("\nPlease input the number of every people.\n");
for(i=0;i<N;)
{
int input;
scanf("%d",&input);
if(input==0)
break;
for(j=0;j<i;j++)
if(data[j]==input)
break;
if(j>=i&&input>0)
{
data[i]=input;
i++;
}
else
printf("\nData error.Re-input:");
}
total=i;
printf("\nYou have input:\n");
for(i=0;i<total;i++)
{
if(i%10==0)
printf("\n");
printf("%4d",data[i]);
}
printf("\nPlease input a number to count:");
scanf("%d",&k);
yuesefu1(data,result,total,k);
printf("\nThe sequence is:\n");
for(i=0;i<total;i++)
printf("%d ",result[i]);

❹ 求查找算法(折半查找法,顺序查找法,分别在一个程序里)“动画演示”程序源代码,一共两个源代码

折半搜索(英语:half-interval search),也称二分搜索(英语:binary search)、对数搜索(英语:logarithmic search),是一种在有序数组中查找某一特定元素的搜索算法。

搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

折半查找法是效率较高的一种查找方法。假设有已经按照从小到大的顺序排列好的五个整数a0~a4,要查找的数是X,其基本思想是: 设查找数据的范围下限为l=0,上限为h=4,求中点m=(l+h)/2,用X与中点元素am比较,若X等于am,即找到,停止查找;否则,若X大于am,替换下限l=m+1,到下半段继续查找;若X小于am,换上限h=m-1,到上半段继续查找;如此重复前面的过程直到找到或者l>h为止。如果l>h,说明没有此数,打印找不到信息,程序结束。

函数实现如下:

bin_search(intA[],intn,intkey){
intlow,high,mid;
low=0;
high=n-1;
while(low<=high)
{
mid=(low+high)/2;
if(A[mid]==key)returnmid;
if(A[mid]<key){
low=mid+1;
}
if(A[mid]>key){
high=mid-1;
}
}
return-1;
}
C语言实现代码
#include<stdio.h>intmain()
{
inta[11]={0,1,2,3,4,5,6,7,8,9,10},min=0,max=10,mid,n;//max为数列长度,a[0]作为第一个数组元素
printf("请输入您要查找的数: ");
scanf("%d",&n);
while(min+1!=max)
{
mid=(min+max)/2;
if(n>a[mid])min=mid;
elseif(n<a[mid])max=mid;
else
{
printf("输入的数在数列的第%d位 ",mid);
exit(0);
}
}
if(n==a[max])
{
max+=1;
printf(" 输入的数在数列的第%d位 ",max);
}
elseif(n==a[min])
{
min+=1;
printf(" 输入的数在数列的第%d位 ",min);
}
elseif(n!=a[mid])
printf(" 输入的数不在数列中");
}
Dev-c++实现
#include<stdio.h>
#include<stdlib.h>
voidmain()
{
inta[15]={1,2,3,4,5,6,7,8,9,10,11,12,13,15};
intn,m,top,bot,mid;
top=m=1;//此处修改top=0;m=1;
bot=14;
printf("pleaseinputanumber:");
scanf("%d",&n);
while(top<=bot)
{
mid=(top+bot)/2;
if(n==a[mid])
{
printf("这是第%d个元素的值。 ",mid+1);
m=0;
break;
}
elseif(n>a[mid])
top=mid+1;
elseif(n<a[mid])
bot=mid-1;
}
if(m)
printf("无此数。 ");
system("PAUSE");
return0;
}

顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法。

对于任意一个序列以及一个给定的元素,将给定元素与序列中元素依次比较,直到找出与给定关键字相同的元素,或者将序列中的元素与其都比较完为止。

函数实现如下:

intsq_search(keytypekeyp[],intn,keytypekey)
{
inti;
for(i=0;i<n;i++)
if(key[i]==key)
returni;//查找成功
return-1;//查找失败
}

上面只是算法实现函数,对于动画部分,自己用moveto,lineto描点划线的方式实现吧。

❺ A*搜寻算法的代码实现(C语言实现)

用C语言实现A*最短路径搜索算法,作者 Tittup frog(跳跳蛙)。 #include<stdio.h>#include<math.h>#defineMaxLength100 //用于优先队列(Open表)的数组#defineHeight15 //地图高度#defineWidth20 //地图宽度#defineReachable0 //可以到达的结点#defineBar1 //障碍物#definePass2 //需要走的步数#defineSource3 //起点#defineDestination4 //终点#defineSequential0 //顺序遍历#defineNoSolution2 //无解决方案#defineInfinity0xfffffff#defineEast(1<<0)#defineSouth_East(1<<1)#defineSouth(1<<2)#defineSouth_West(1<<3)#defineWest(1<<4)#defineNorth_West(1<<5)#defineNorth(1<<6)#defineNorth_East(1<<7)typedefstruct{ signedcharx,y;}Point;constPointdir[8]={ {0,1},//East {1,1},//South_East {1,0},//South {1,-1},//South_West {0,-1},//West {-1,-1},//North_West {-1,0},//North {-1,1}//North_East};unsignedcharwithin(intx,inty){ return(x>=0&&y>=0 &&x<Height&&y<Width);}typedefstruct{ intx,y; unsignedcharreachable,sur,value;}MapNode;typedefstructClose{ MapNode*cur; charvis; structClose*from; floatF,G; intH;}Close;typedefstruct//优先队列(Open表){ intlength; //当前队列的长度 Close*Array[MaxLength]; //评价结点的指针}Open;staticMapNodegraph[Height][Width];staticintsrcX,srcY,dstX,dstY; //起始点、终点staticCloseclose[Height][Width];//优先队列基本操作voidinitOpen(Open*q) //优先队列初始化{ q->length=0; //队内元素数初始为0}voidpush(Open*q,Closecls[Height][Width],intx,inty,floatg){ //向优先队列(Open表)中添加元素 Close*t; inti,mintag; cls[x][y].G=g; //所添加节点的坐标 cls[x][y].F=cls[x][y].G+cls[x][y].H; q->Array[q->length++]=&(cls[x][y]); mintag=q->length-1; for(i=0;i<q->length-1;i++) { if(q->Array[i]->F<q->Array[mintag]->F) { mintag=i; } } t=q->Array[q->length-1]; q->Array[q->length-1]=q->Array[mintag]; q->Array[mintag]=t; //将评价函数值最小节点置于队头}Close*shift(Open*q){ returnq->Array[--q->length];}//地图初始化操作voidinitClose(Closecls[Height][Width],intsx,intsy,intdx,intdy){ //地图Close表初始化配置 inti,j; for(i=0;i<Height;i++) { for(j=0;j<Width;j++) { cls[i][j].cur=&graph[i][j]; //Close表所指节点 cls[i][j].vis=!graph[i][j].reachable; //是否被访问 cls[i][j].from=NULL; //所来节点 cls[i][j].G=cls[i][j].F=0; cls[i][j].H=abs(dx-i)+abs(dy-j); //评价函数值 } } cls[sx][sy].F=cls[sx][sy].H; //起始点评价初始值 // cls[sy][sy].G=0; //移步花费代价值 cls[dx][dy].G=Infinity;}voidinitGraph(constintmap[Height][Width],intsx,intsy,intdx,intdy){ //地图发生变化时重新构造地 inti,j; srcX=sx; //起点X坐标 srcY=sy; //起点Y坐标 dstX=dx; //终点X坐标 dstY=dy; //终点Y坐标 for(i=0;i<Height;i++) { for(j=0;j<Width;j++) { graph[i][j].x=i;//地图坐标X graph[i][j].y=j;//地图坐标Y graph[i][j].value=map[i][j]; graph[i][j].reachable=(graph[i][j].value==Reachable); //节点可到达性 graph[i][j].sur=0;//邻接节点个数 if(!graph[i][j].reachable) { continue; } if(j>0) { if(graph[i][j-1].reachable) //left节点可以到达 { graph[i][j].sur|=West; graph[i][j-1].sur|=East; } if(i>0) { if(graph[i-1][j-1].reachable &&graph[i-1][j].reachable &&graph[i][j-1].reachable) //up-left节点可以到达 { graph[i][j].sur|=North_West; graph[i-1][j-1].sur|=South_East; } } } if(i>0) { if(graph[i-1][j].reachable) //up节点可以到达 { graph[i][j].sur|=North; graph[i-1][j].sur|=South; } if(j<Width-1) { if(graph[i-1][j+1].reachable &&graph[i-1][j].reachable &&map[i][j+1]==Reachable)//up-right节点可以到达 { graph[i][j].sur|=North_East; graph[i-1][j+1].sur|=South_West; } } } } }}intbfs(){ inttimes=0; inti,curX,curY,surX,surY; unsignedcharf=0,r=1; Close*p; Close*q[MaxLength]={&close[srcX][srcY]}; initClose(close,srcX,srcY,dstX,dstY); close[srcX][srcY].vis=1; while(r!=f) { p=q[f]; f=(f+1)%MaxLength; curX=p->cur->x; curY=p->cur->y; for(i=0;i<8;i++) { if(!(p->cur->sur&(1<<i))) { continue; } surX=curX+dir[i].x; surY=curY+dir[i].y; if(!close[surX][surY].vis) { close[surX][surY].from=p; close[surX][surY].vis=1; close[surX][surY].G=p->G+1; q[r]=&close[surX][surY]; r=(r+1)%MaxLength; } } times++; } returntimes;}intastar(){ //A*算法遍历 //inttimes=0; inti,curX,curY,surX,surY; floatsurG; Openq;//Open表 Close*p; initOpen(&q); initClose(close,srcX,srcY,dstX,dstY); close[srcX][srcY].vis=1; push(&q,close,srcX,srcY,0); while(q.length) { //times++; p=shift(&q); curX=p->cur->x; curY=p->cur->y; if(!p->H) { returnSequential; } for(i=0;i<8;i++) { if(!(p->cur->sur&(1<<i))) { continue; } surX=curX+dir[i].x; surY=curY+dir[i].y; if(!close[surX][surY].vis) { close[surX][surY].vis=1; close[surX][surY].from=p; surG=p->G+sqrt((curX-surX)*(curX-surX)+(curY-surY)*(curY-surY)); push(&q,close,surX,surY,surG); } } } //printf("times:%d ",times); returnNoSolution;//无结果}constintmap[Height][Width]={ {0,0,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,1,1}, {0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1}, {0,0,0,0,0,0,1,0,0,0,0,0,0,1,1,0,0,0,0,1}, {0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,1,0,1}, {0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0}, {0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0}, {0,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0}, {0,0,0,0,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0}, {0,1,0,0,0,0,1,0,0,0,0,0,0,1,0,1,0,0,0,1}, {0,0,0,0,1,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0}};constcharSymbol[5][3]={"□","▓","▽","☆","◎"};voidprintMap(){ inti,j; for(i=0;i<Height;i++) { for(j=0;j<Width;j++) { printf("%s",Symbol[graph[i][j].value]); } puts(""); } puts("");}Close*getShortest(){ //获取最短路径 intresult=astar(); Close*p,*t,*q=NULL; switch(result) { caseSequential: //顺序最近 p=&(close[dstX][dstY]); while(p) //转置路径 { t=p->from; p->from=q; q=p; p=t; } close[srcX][srcY].from=q->from; return&(close[srcX][srcY]); caseNoSolution: returnNULL; } returnNULL;}staticClose*start;staticintshortestep;intprintShortest(){ Close*p; intstep=0; p=getShortest(); start=p; if(!p) { return0; } else { while(p->from) { graph[p->cur->x][p->cur->y].value=Pass; printf("(%d,%d)→ ",p->cur->x,p->cur->y); p=p->from; step++; } printf("(%d,%d) ",p->cur->x,p->cur->y); graph[srcX][srcY].value=Source; graph[dstX][dstY].value=Destination; returnstep; }}voidclearMap(){ //ClearMapMarksofSteps Close*p=start; while(p) { graph[p->cur->x][p->cur->y].value=Reachable; p=p->from; } graph[srcX][srcY].value=map[srcX][srcY]; graph[dstX][dstY].value=map[dstX][dstY];}voidprintDepth(){ inti,j; for(i=0;i<Height;i++) { for(j=0;j<Width;j++) { if(map[i][j]) { printf("%s",Symbol[graph[i][j].value]); } else { printf("%2.0lf",close[i][j].G); } } puts(""); } puts("");}voidprintSur(){ inti,j; for(i=0;i<Height;i++) { for(j=0;j<Width;j++) { printf("%02x",graph[i][j].sur); } puts(""); } puts("");}voidprintH(){ inti,j; for(i=0;i<Height;i++) { for(j=0;j<Width;j++) { printf("%02d",close[i][j].H); } puts(""); } puts("");}intmain(intargc,constchar**argv){ initGraph(map,0,0,0,0); printMap(); while(scanf("%d%d%d%d",&srcX,&srcY,&dstX,&dstY)!=EOF) { if(within(srcX,srcY)&&within(dstX,dstY)) { if(shortestep=printShortest()) { printf("从(%d,%d)到(%d,%d)的最短步数是:%d ", srcX,srcY,dstX,dstY,shortestep); printMap(); clearMap(); bfs(); //printDepth(); puts((shortestep==close[dstX][dstY].G)?"正确":"错误"); clearMap(); } else { printf("从(%d,%d)不可到达(%d,%d) ", srcX,srcY,dstX,dstY); } } else { puts("输入错误!"); } } return(0);}

❻ 寻找最短路径的汇编语言实现源代码是什么(用Dijkstra 算法)

Dijkstra算法Dijkstra算法是典型的最短路径算法,用于计算一个节点的最短路径中的所有其他节点。其主要特点是出发点为中心向外层层扩展,直到扩展到结束日期。 Dijkstra最短路径算法能得出最佳的解决方案,但许多节点,它遍历计算,这样的效率是低的。最短路径算法的
Dijkstra算法是非常有代表性的许多专业课程的基本内容进行了详细的介绍,如数据结构,图论,运筹学,等等。
Dijkstra算法的一般性发言一般有两种方式,永久和临时的标签,开启,关闭表的方式之一,德鲁表示,为了引进和下面的A *算法和D *算法一致,这里是开放的,关闭表。
贪婪的方法,算法策略
大概过程如下:
创建两个表,打开,关闭。
OPEN表保存没有调查之前已产生的所有节点,CLOSED表中记录已访问过的节点。
1。的道路网络的出发点和等待在公开组的检查没有检查点,此点。
2。打开表,以找出从起点最近的点,以确定所有的子节点,这一点,这点上关闭表。
3。遍历访问这个点的子节点。获得这些子节点从子节点到OPEN表的放电的开始点的距离的值。
4。重复步骤2和步骤3,直到OPEN表为空,或找到目标点。
[编辑本段]算法是
包括的文件
定义MAXNUM 765432100的
使用命名空间std;
ifstream的散热片(Dijkstra算法。在“);
ofstream这样的FOUT(”Dijkstra.out“);
诠释地图[501] [501];
布尔is_arrived [501];
诠释区[501] [501],堆栈[501];
整数P,Q,K,路径,源代码,顶点,温度,SetCard
诠释FindMin()
{
诠释P,温度= 0,MINM = MAXNUM;
(P = 1,P <=顶点,P + +)
((区[P] MINM)&&(!is_arrived [P] ))
{
MINM区[P]。
温度= P;
}
收益温度;
}
:( )
{
的memset(is_arrived,0,大小(is_arrived));
鳍>>源代码>>顶点;
(P = 1,P <=顶点,P + +)
(Q = 1,Q =顶点,Q + +)
{
鳍>>地图[P] [Q];
(图[ P] [Q] == 0)地图[P] [Q] = MAXNUM;
}
为(P = 1,P <=顶点,P + +)
{ />区[P] =地图[来源] [P];
(区[P]!= MAXNUM)
[P] =源;
其他
[P] = P;
}
is_arrived [来源] = TRUE;
SetCard = 1;

{
温度= FindMin();
(Temp! = 0)
{
SetCard SetCard +1;
is_arrived [温度] = TRUE;
(P = 1,P <=顶点,P + +)
((区[P]>区[温度] +地图[温度] [P])&&(!is_arrived [P]))
{
区[P] =区[温度] +地图[温度] [P]
[P] =温度;
}
}
其他
突破; BR />}
(SetCard! =顶点);
(P = 1,P <=顶点,P + +)
(p! =源)
{
FOUT <<“======================== \ n”;
FOUT <<“来源:”<; <资料来源<<“\ n目标:”“P <<'\ n';
(区[P] == MAXNUM)
{
FOUT <<”距离:“< “无限\ n”;
FOUT <<“路径:没办法!”;
}
其他
{
FOUT“距离”:“<<区[P] <<'\ n';
K = 1;
路径= P;
同时(从[路径]!=路径)
{
栈[K] =路径;
路径=从[路径];
K = K +1;
}
FOUT <<“路径:”<(Q = K-1,Q = 1,Q - )
FOUT“ - >”<<栈[问];
}
FOUT <<“\ ?======================== \ n \ n“;}

fin.close();
fout.close();
返回0;
}
样品输入
2
7
00 20 50 30 00 00 00
20 00 25 00 00 70 00
50 25 00 40 25 50 00
30 00 40 0??0 55 00 00
00 00 25 55 00 10 00
00 70 50 00 10 00 00
00 00 00 00 00 00 00
样本输出
========================
来源:2
目标:1
距离:20
路径:2 - > 1
==================== ====
========================
来源:
目标:3
距离:25
路径:2 - > 3 ========================

===== ===================
来源:
目标:4
距离:50
路径:2 - > 1 - > ======================== 4

============== =========
来源:
目标:5
距离:50
路径:2 - > 3 - > 5
== ======================
========================
来源:
目标:6
距离:60
路径:2 - > 3 - > 5 - > 6
========= ===============
========================
来源:2
目标:7
距离:无限
路径:没办法!
========================
示例程序和相关子程序如下:
无效的Dijkstra(INT N,INT [ ]距离的int [] iPath标)
{
诠释最短距离,U
INT I,J;
/ /从n个顶点的邻接矩阵的副本可以摆脱行了,是复制前n行的距离[]
(i = 0;我VerNum,我+ +)
{
距离=圆弧[N];
访问= 0;
} / / n个结点访问,因为n个顶点的出发点是
访问[N] = 1;
/ /找到的顶点其他顶点的路线,并且它不是顶点n的开头,没有先前旅游。
/ /相当于u点,这一点是没有的出发点N(i = 0; I <VerNum,我+ +)
{
U = 0

最短距离=否;
为(J = 0; <VerNum; + +)
(访问[J] == 0 &&(距离[J]最短距离))
{
最短距离=距离[J];
ü= J;
}
/ /例如P1871图G6距离=无,无,无,30,100]第一次看的是V2,U = 2
/ /找到结束,的MinDis意味着它无法连接,然后返回。这种情况是相似的V5。

(最短距离==否)返回;
/ /建立一个u个顶点将被用于顶点u,相当于弧[V,U +弧U,W] 。
访问[U] = 1;
/ /找到一个U顶点到所有其他顶点最小的路径实际上是在寻找弧] [U,J,J值在[0, VerNum]。
/ /如果是圆弧,U [I] +凯旋门[U,J] ARC [I,J],ARC [I,J] =弧[I,U] +凯旋门[U J] <弧[I,J]
/ /的做法,因为距离[]是期望的结果,起始点确定的情况下,那就是:

/ /如果(距离[U] +圆弧[U,J)<=距离[J]:
/ /距离[J]距离[U] + [U,J弧];
/ /保存iPath标[] u点数量;
/ /同样,设置访问量:新发现的路由[J] = 0,经过寻找另一条道路,这条道路可能不利用。 V3
(J = 0; <VerNum; + +)
(访问[J] == 0 &&弧U,J] <&& U!= J) /> {
((距离[U] +圆弧[U,J)<=距离[J])
{
距离[J]距离[U] +弧[ U,J];
访问[J] = 0;
iPath标[J] = U;
}
}
}
} / /辅助功能
无效的Prim(),
{
INT I,M,N = 0;
为(i = 0;我VerNum;我+ +)
{
访问= 0;
T =新的TreeNode();
T.Text = V;
}
访问[N] + +;
listBox1.Items。添加(V [N]);
(参观()> 0)
{
((M = MinAdjNode(N))!= -1)
{ BR /> T [N]。 Nodes.Add(T [M]);
N = M;
访问[N] + +;
}
其他
{
?= MinNode(0);
(N> 0)T [旻]。 Nodes.Add(T [敏]);
访问[N] + +;
}
listBox1.Items.Add(V [N]);
} treeView1.Nodes.Add(T [0]);
}
的无效TopoSort()
{
INT I,N;
listBox1.Items.Clear( );
栈S =新的堆栈();
为(i = 0;我VerNum,我+ +)
访问= 0;
为(= VerNum- 1> = 0; I - )
(入度(I)== 0)
{
S.Push(I);
访问+ +; ...... />}
而(S.Count!= 0)
{
N =(INT)S.Pop();
listBox1.Items.Add(V [N] );
CLEARLINK(N);
为(i = VerNum-1> = 0; I - )
(分== 0 &&入度(I)== 0)
{
S.Push(I);
访问+ +;
}
}
}
无效AOETrave(INT N,树节点TR,W)
{
INT I,W0;
(出度(N)== 0)返回;
(i = 0; <VerNum; + +)
((W0 =圆弧[N,I])!= 0)
{
listBox1.Items.Add(V +“\ t”+(W + W0)的ToString()+“\ t”+ i.ToString()+“\ t”+ n.ToString());
TreeNode的T1 =新的TreeNode();
T1.Text = V + “W =”+(W + W0)。的ToString()+“]”;
TR.Nodes.Add(T1);
AOETrave(I,T1,W + W0);
}
}
无效AOE()
{
INT I,W = 0,M = 1;
TreeNode的T1 =新的TreeNode();
为(i = 0; <VerNum;我+ +)
{
访问= 0;
}
T1.Text = V [0];
listBox1.Items.Add(“父母符号显示生成树:“);
listBox1.Items.Add(”V \ TW \工业贸易署\ TPID“);
为(i = 0;我VerNum,我+ +)
{
((W =弧[0,I])!= 0)
{
listBox1.Items.Add(V +“\ t”+ w.ToString()+“\ T“+ i.ToString()+”\ T0“);
TreeNode的T2 =新的TreeNode();
T2.Text = V +”W =“+ w.ToString()+” “;
AOETrave(I,T2,W);
listBox1.Items.Add(”\ t \ t树“+ m.ToString
T1.Nodes.Add( T2),());
米+ +;
}
}
treeView1.Nodes.Clear();
treeView1.Nodes.Add(T1);
}
IsZero()
{
我;
为(i = 0;我VerNum,我+ +)
(LineIsZero (一)> = 0)返回;
返回-1;
}
诠释LineIsZero(N)
{

(i = 0; <VerNum;我+ +)
(电弧[N,I] = 0)返回;
返回-1;}

:无效DepthTraverse()
{
INT I,M;
(i = 0; <VerNum,我+ +)
{
访问= 0; BR /> T =新的TreeNode();
T.Text = V
R = 0;
}
而((M = IsZero())> = 0)
{
(访问[M] == 0)
{
listBox1.Items.Add(V [M]);
R [M] = 1 ;}

访问[M] + +;
DTrave(M);
}
为(i = 0; {
(R == 1)
treeView1.Nodes.Add(T);
}
}
无效DTrave(N) /> {
我;
(LineIsZero(N)<0)返回;
为(i = VerNum-1> = 0; I - )
(弧[N] = 0)
{
弧[N,I] = 0;
弧[I,N] = 0;
(访问= = 0)
{
listBox1.Items.Add(V);
T [N]。 Nodes.Add(T);
R = 0;
}
访问+ +;
DTrave(I);
}
} :无效BreadthTraverse()
{
INT I,M;
(i = 0; <VerNum,我+ +)
{
访问= 0;
T =新的TreeNode();
T.Text = V;
R = 0;
}
而((M = IsZero())> = 0 )
{
(访问[M] == 0)
{
listBox1.Items。添加(V [M]);
R [M] = 1;
}
访问[M] + +;
BTrave(M);
} BR />(i = 0;我VerNum,我+ +)
{
(R == 1)
treeView1.Nodes.Add(T);
}
}
无效BTrave(N)
{

队列Q =新的Queue();
Q.Enqueue(N)
而(Q.Count!= 0)
{
为(i = 0;我VerNum,我+ +)
{
(电弧N,I] = 0)
{
弧[N,I] = 0;
弧[N] = 0;
(访问== 0)
{
listBox1.Items.Add(V);
T [N]。 Nodes.Add(T);
直径= 0;
}
访问+ +;
Q.Enqueue(I);
}
} BR /> N =(int)的Q.Dequeue();
}
}
诠释MinNode(VN)
{
INT I,J,N,米,最小=否;
N = -1,M = -1;
为(i = VN我VerNum,我+ +)
中for(j = 0; J < VerNum; + +)
(电弧[I,J] = &&弧[I,J]闵&&分== 0 &&访问[J] == 1)
{ BR />最小值=弧[I,J]; N = I,M = J;
}
敏=旻= M
返回n;
} BR />诠释MinAdjNode(N)
{
我,敏,米;
最小值=否,M = -1;
(i = 0; I < VerNum,我+ +)
(电弧[N,I] =没有访问&& == 0 &&最小弧[N,I] &&访问[N] == 1){BR /> BR />最小值=弧[N,I],M = I;}

返回米;
}
INT访问()
{
INT I,S = 0;
为(i = 0; <VerNum,我+ +)
(访问== 0)+ +;
返回s;
>}

[编辑本段] Dijkstra算法的Pascal实现:
程序Dijkstra的;
VAR
答:ARRAY [1 .. 100,1 .. 100的整数;
标志:数组[1] .. 100]布尔值;
W,X,N,I,J,分,明尼苏达州:整数;
开始
readln(N);
我:= 1到n
开始
对于j = 1到n
读(A);
readln;
结束;
fillchar(标志中,sizeof(标志),假);
标志[1]:= TRUE;
明尼苏达州:= 1;
为:= 2到n
开始
分: 32767;
W:=明尼苏达州
我:= 1到n做
(W >)和([W,I] <MIN),然后
开始
分:= [];
明尼苏达州:= I;
结束;
标志[明尼苏达州]:= TRUE;
J: 1到n做
(J >明尼苏达州)和(A [1,明尼苏达州] + A [明尼苏达州,J],A [1,J)和(标志[J] = FALSE),那么 BR /> A [1,J] = [1,明尼苏达州] + A [明尼苏达州,J];
结束;
我:= 1到n做
写( [1]);
年底。

❼ 详细介绍广度优先搜索的实现,原理,c++程序

宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一,这一算法也是很多重要的图的算法的原型。Dijkstra单源最短路径算法和Prim最小生成树算法都采用了和宽度优先搜索类似的思想。其别名又叫BFS,属于一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位址,彻底地搜索整张图,直到找到结果为止。

已知图G=(V,E)和一个源顶点s,宽度优先搜索以一种系统的方式探寻G的边,从而“发现”s所能到达的所有顶点,并计算s到所有这些顶点的距离(最少边数),该算法同时能生成一棵根为s且包括所有可达顶点的宽度优先树。对从s可达的任意顶点v,宽度优先树中从s到v的路径对应于图G中从s到v的最短路径,即包含最小边数的路径。该算法对有向图和无向图同样适用。
之所以称之为宽度优先算法,是因为算法自始至终一直通过已找到和未找到顶点之间的边界向外扩展,就是说,算法首先搜索和s距离为k的所有顶点,然后再去搜索和S距离为k+l的其他顶点。
为了保持搜索的轨迹,宽度优先搜索为每个顶点着色:白色、灰色或黑色。算法开始前所有顶点都是白色,随着搜索的进行,各顶点会逐渐变成灰色,然后成为黑色。在搜索中第一次碰到一顶点时,我们说该顶点被发现,此时该顶点变为非白色顶点。因此,灰色和黑色顶点都已被发现,但是,宽度优先搜索算法对它们加以区分以保证搜索以宽度优先的方式执行。若(u,v)∈E且顶点u为黑色,那么顶点v要么是灰色,要么是黑色,就是说,所有和黑色顶点邻接的顶点都已被发现。灰色顶点可以与一些白色顶点相邻接,它们代表着已找到和未找到顶点之间的边界。
在宽度优先搜索过程中建立了一棵宽度优先树,起始时只包含根节点,即源顶点s.在扫描已发现顶点u的邻接表的过程中每发现一个白色顶点v,该顶点v及边(u,v)就被添加到树中。在宽度优先树中,我们称结点u 是结点v的先辈或父母结点。因为一个结点至多只能被发现一次,因此它最多只能有--个父母结点。相对根结点来说祖先和后裔关系的定义和通常一样:如果u处于树中从根s到结点v的路径中,那么u称为v的祖先,v是u的后裔。

阅读全文

与人群搜索算法的实现源代码相关的资料

热点内容
信捷加密文件是干嘛用的 浏览:952
su模型下载怎么解压不了 浏览:182
国际体验服如何把服务器改为亚服 浏览:880
手机怎么关闭视频加密 浏览:462
单片机编程存表法 浏览:719
富士康服务器是什么 浏览:452
编译是二进制吗 浏览:262
小程序账号登录源码 浏览:876
云南社保局app叫什么 浏览:697
美女程序员吃大餐 浏览:210
项目二级文件夹建立规则 浏览:560
dns使用加密措施吗 浏览:174
php独立运行 浏览:535
手机sh执行命令 浏览:731
云服务器的角色 浏览:737
单片机频率比例 浏览:845
我的世界服务器如何关闭正版验证 浏览:508
如何查roid服务器上的 浏览:134
安卓手机主板如何撬芯片不掉电 浏览:253
php各个框架的优缺点 浏览:105