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;ifor(intj=i+1;jif(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;}
实验思考题(实训心得):
评语:
教师签字:
年月日