C常用经典算法及其实现修订稿

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C常用经典算法及其实

公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

常用算法经典代码(C++版)

一、快速排序

void qsort(int x,int y) a[n]数组中

{int h=x,r=y;

int m=a[(x+y)>>1]; a[n]数组中

{for(int i=1;i

{for(int i=1;i

{d);d);d);d);d);d);child=l; ather=i; child=r; ather=i;

a=a[l].da+a[r].da; a>a[s].da)&&(a[s].father==0)) ather=0,说明这个结点还不是别个结点

mins=s; ather==0) {a[x].code=”“;}ather].lchild==x)

a[x].code=a[a[x].father].code+'0';

if(a[a[x].father].rchild==x) a[x].code=a[a[x].father].code+'1';

if(a[x].lchild!=0)

inorder(a[x].lchild);child==0)&&(a[x].rchild==0))a<<':'<

if(a[x].rchild!=0) inorder(a[x].rchild);rom=1;

elist[i].to=i+1;

elist[i].w=a[1][i+1];

}

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

if(m!=i) >a[elist[i].to][elist[j].to])

elist[j].w=a[elist[i].to][elist[j].to];}

}

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

}

?

如果要求出哪些边构成最小生成树,在更新第i+1至n-1条边到已经生成的树中最小距离时(上面代码中加粗的部分),还要加上

elist[j].from=elist[i].to;语句,即在更新权值时,还应该更新起点。

Prime算法适用于顶点不是太多的稠密图,如果对于顶点数较多的稀疏图,就不太适用了。

?

十九、Dijkstra算法

void dijkstra(int x) ;

while(h

{while(elist[h].w

while(elist[r].w>m) r--;

if(h<=r)

{edge tmp=elist[h];elist[h]=elist[r];elist[r]=tmp;h++;r--;}

}

if(x

if(h

}

?

int getfather(int x)rom);o);;}//不在同一个集合,合并,即第i条边可以选取。

if(sum>n-1)

break;//已经确定了n-1条边了,最小生成树已经生成了,可以提前退出循环了

}

if(sum

cout<<"Impossible"<

else

cout<

}

?

克鲁斯卡尔算法,只用了边集数组,没有用到图的邻接矩阵,因此当图的结点数比较多的时候,输入数据又是边的信息时,就要考虑用Kruscal算法。对于岛国问题,我们就要选择此算法,如果用Prim算法,还要开一个二维的数组来表示图的邻接矩阵,对于10000个点的数据,显然在空间上是无法容忍的。

?

二十一、Floyed算法

void floyed(void)// a[i][j]表示结点i到结点j的最短路径长度,初始时值为的权值。

{for(int k=1;k<=n;k++) //枚举中间加入的结点不超过K时f[i][j]最短路径长度,K相当DP中的阶段

for(int i=1;i<=n;i++) //i,j是结点i到结点J,相当于DP中的状态

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

if (a[i][j]>a[i][k]+a[k][j]) a[i][j]=a[i][k]+a[k][j];//这是决策,加和不加中间点,取最小的值

}

?

弗洛伊德算法适合于求没有负权回路的图的最短路径长度,利用FLOYED算法,可写出判断结点i和结点J是否连通的算法。

?

二十二、01背包问题

n为物品的数量,w[i]表示第i个物品的重量,c[i]表示第i个物品的价值,v 为背包的最大重量。

有状态转移方程f[i][j]=max{f[i-1][j],f[i-1][j-w[i]]+c[i]}。f[i][j]表示前i个物品,在背包载重为j时获得的最大价值。显然f[n][v]即为所求。边界条件为f[0][s]=0,s=0,1, (v)

for(int i=1;i<=n;i++)//枚举阶段

for(int j=0;j<=v;j++)//枚举状态,当然此处也可写成:for(int

j=v;j>=0;j--)

{

f[i][j]=f[i-1][j];//不选第i个物品

相关文档
最新文档