贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx

上传人:b****6 文档编号:6466001 上传时间:2023-01-06 格式:DOCX 页数:11 大小:55.44KB
下载 相关 举报
贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx_第1页
第1页 / 共11页
贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx_第2页
第2页 / 共11页
贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx_第3页
第3页 / 共11页
贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx_第4页
第4页 / 共11页
贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx

《贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx》由会员分享,可在线阅读,更多相关《贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx(11页珍藏版)》请在冰豆网上搜索。

贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法.docx

贪心算法Dijkstra普里姆Prim克鲁斯卡尔算法最短路算法

实验(实训)报告

辽宁科技大学学院(系)专业时间:

课程名称:

算法

实验(实训)题目:

贪心算法的应用

班级:

姓名

学号

机台号

任课程教师

实验(实训)目的:

1.掌握贪心算法的基本要素,包括贪心选择性质与最优子结构性质。

2.掌握贪心算法解决问题的基本步骤,并利用它解决实际问题。

3.熟练掌握Dijkstra、普里姆(Prim)与克鲁斯卡尔算法(Kruskal)。

实验(实训)原理、装置、内容、步骤、数据记录及结果分析:

1.已知3个物体与一个背包,物体重量为W=(w1,w2,w3)=(18,15,10),价值P=(p1,p2,p3)=(25,24,15),背包的容量为M=20,物品可以分割成任意大小,要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。

答案为(0,1,1/2),最优值为31.5。

#include

voidSort(intn,floatv[],floatw[])

{inti;

floatt;

for(i=1;i

if(v[i]>v[i+1]){t=v[i];v[i]=v[i+1];v[i+1]=t;}

for(i=1;i

if(w[i]>w[i+1]){t=w[i];w[i]=w[i+1];w[i+1]=t;}

}

voidKnapsack(intn,floatM,floatv[],floatw[],floatx[])

{

Sort(n,v,w);

for(inti=1;i<=n;i++)x[i]=0;

floatc=M;

for(i=1;i<=n;i++)

{if(w[i]>c)break;

x[i]=1;c-=w[i];}

if(i<=n)x[i]=c/w[i];

for(i=1;i<=n;i++)

printf("%f\n",x[i]);}

voidmain()

{floatw[]={0,10,15,18},value=0;

floatv[]={0,15,24,25};

floatx[]={0,0,0,0};

Knapsack(3,20,v,w,x);

for(inti=1;i<4;i++)

value=value+x[i]*v[i];

printf("TotalValue:

%f",value);}

4.装载问题描述如下:

有一批共n个集装箱要装上艘载重量为c的轮船,其中集装箱i的重量为wi。

找出一种最优装载方案,将轮船尽可能装满,即在装载体积不受限制的情况下,将尽可能重的集装箱装上轮船。

 

#include

voidSort(inta[],intt[],intn)

{inttemp,min;

for(inti=1;i<=n;i++)t[i]=i;

for(i=1;i<=n;i++)

{min=i;

for(intj=i+1;j<=n;j++)

if(a[j]

temp=a[i];a[i]=a[min];a[min]=temp;

temp=t[i];t[i]=t[min];t[min]=temp;}

}

voidLoading(intx[],intw[],intc,intn)

{int*t=newint[n+1];

inti;

Sort(w,t,n);

for(i=1;i<=n;i++)x[i]=0;

for(i=1;i<=n&&w[t[i]]<=c;i++)

{x[t[i]]=1;c-=w[t[i]];

}

}

voidmain()//ÓÃmainº¯ÊýÑéÖ¤

{intw[9]={0,100,200,50,90,150,50,20,80},x[9]={0};intc=400;

Loading(x,w,c,8);

for(inti=1;i<=8;i++)

printf("%d\t",x[i]);

printf("\n");

5.已知个带权有向图,如图所示,其中每条边的

权是两个顶点的距离,用Dijkstra算法计算从

源到所有其他各项点的最短路径长度。

#include

usingnamespacestd;

voidDijkstra(intn,intv,intdist[],intprev[],intc[6][6])

{intmaxint=65535;bool*s=newbool[n];

for(inti=1;i<=n;i++)

{dist[i]=c[v][i];s[i]=false;

if(dist[i]==maxint)prev[i]=0;

elseprev[i]=v;}

dist[v]=0;s[v]=true;

for(i=1;i

{inttemp=maxint;intu=v;

for(intj=1;j<=n;j++)

if((!

s[j])&&(dist[j]

s[u]=true;

for(j=1;j<=n;j++)

{if((!

s[j])&&(c[u][j]

{intnewdist=dist[u]+c[u][j];

if(newdist

}}}}

voidmain()

{intn=5,v=1,u=5;inti,j;intq=0;intdist[6],prev[6];

int*way=newint[n+1];

intc[6][6]={{0,0,0,0,0,0},{0,0,10,65535,30,100},

{0,65535,0,50,65535,65535},{0,65535,65535,0,65535,10},

{0,65535,65535,20,0,60},{0,65535,65535,65535,65535,0}};

Dijkstra(n,v,dist,prev,c);

cout<<"×î¶Ì·¾¶´Ó"<"<

"<

intw=u;

while(w!

=v)

{q++;way[q]=prev[w];w=prev[w];}

cout<<"·¾¶Îª£º";

for(j=q;j>=1;j--)

cout<";

cout<

6.用普里姆(Prim)算法求的最小生成树。

#include//prim

#definemaxint30

#defineMAXCOST1000

voidprim(intc[maxint][maxint],intn)//c[i][j]ΪȨ,´òÓ¡×îСÉú³ÉÊ÷ÿÌõ±ß

{inti,j,k,min,lowcost[maxint],closest[maxint];bools[maxint];

s[1]=true;

for(i=2;i<=n;i++)/*´Ó¶¥µã1¿ªÊ¼*/

{lowcost[i]=c[1][i];closest[i]=1;s[i]=false;}

/*´ÓSÖ®ÍâÇóÀëSÖÐijһ¶¥µã×î½üµÄ¶¥µã*/

for(i=1;i

{min=MAXCOST;j=1;

for(k=2;k<=n;k++)

if(lowcost[k]

s[k])

{min=lowcost[k];j=k;}

printf("(%d,%d)",closest[j],j);/*´òÓ¡±ß*/

s[j]=true;/*jµ½SÖÐ*/

for(k=2;k<=n;k++)

if(c[j][k]

s[k])

{lowcost[k]=c[j][k];closest[k]=j;}}}

voidmain()

{intn=6,i,j,mx[maxint][maxint];

for(i=0;i<=n;i++)

for(j=0;j<=n;j++)

mx[i][j]=MAXCOST;

mx[1][2]=6;mx[1][3]=1;mx[1][4]=5;mx[2][1]=6;mx[2][3]=5;mx[2][5]=3;

mx[3][1]=1;mx[3][2]=5;mx[3][4]=5;mx[3][5]=6;mx[3][6]=4;mx[4][1]=5;

mx[4][3]=5;mx[4][6]=2;mx[5][2]=3;mx[5][3]=6;mx[5][6]=6;mx[6][3]=4;

mx[6][4]=2;mx[6][5]=6;

printf("×îСÉú³ÉÊ÷±ß¼¯£º\n");

prim(mx,n);}

7.用克鲁斯卡尔算法(Kruskal)求最小生成树算法

#include//×îСÉú³ÉÊ÷kruskalËã·¨

#defineVn6//¶¥µãÊý

typedefstruct//±ß¼¯½á¹¹

{intbegin;intend;intweight;}edge;

//ÁÚ½Ó¾ØÕó

intGraph[Vn][Vn]={{0},{6},{1,5},{5,0,5},{0,3,6},{0,0,4,2,6}};

voidEdges(edgea[],int&n);//ÊÕ¼¯±ßÐÅÏ¢

voidSort(edgea[],int);//ÅÅÐò(¿É¸ü»»ÆäËüÅÅÐòËã·¨)

voidKruskal(edgeE[],int);//¹¹Ôì×îСÉú³ÉÊ÷

intFind(intlink[],int);//ÕÒÁ¬Í¨·ÖÖ§µÄβ²¿

voidmain()

{intEn=0;//±ßÊý

edgeEs[Vn*(Vn-1)/2];//±ß¼¯

Edges(Es,En);

Sort(Es,En);

Kruskal(Es,En);

}voidEdges(edgea[],int&n)

{printf("ÁÚ½Ó¾ØÕó£º\n");

for(inti=0;i

{for(intj=0;j<=i;j++)

{printf("%d\t",Graph[i][j]);

if(Graph[i][j]>0)

{a[n].begin=j+1;

a[n].end=i+1;

a[n].weight=Graph[i][j];

n++;

}}

printf("\n");

}}

voidSort(edgea[],intn)

{for(inti=0;i

for(intj=i+1;j

if(a[i].weight>a[j].weight)

{inttemp=a[i].begin;

a[i].begin=a[j].begin;

a[j].begin=temp;

temp=a[i].end;

a[i].end=a[j].end;

a[j].end=temp;

temp=a[i].weight;

a[i].weight=a[j].weight;

a[j].weight=temp;}}

voidKruskal(edgeE[],intN)

{intn,m,link[Vn]={0};

printf("\n×îСÉú³ÉÊ÷:

\n");

for(inti=0;i

{n=Find(link,E[i].begin);

m=Find(link,E[i].end);

if(n!

=m)

{link[n-1]=m;

printf("<%d,%d>%d\n",E[i].begin,E[i].end,E[i].weight);

}}

printf("\n");}

//ÕÒÁ¬Í¨·ÖÖ§µÄβ²¿

intFind(intlink[],intk)

{while(link[k-1]>0)k=link[k-1];

returnk;}

实验思考题(实训心得):

 

评语:

 

教师签字:

年月日

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 教学研究 > 教学案例设计

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1