该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
void gdyx(gre*g)
{
int i,a[20];
for(i=0;iv;i++)
a[i]=0;
for(i=0;iv;i++)
if(!a[i])
gdbl(g,a,a[i]);
} void purim(gre*g)
{
int i,j,k,min,a[10],b[10];
for(i=0;iv;i++)
{
b[i]=g->sz[0][i];
a[i]=1;
}
a[0]=0;
for(i=1;iv;i++)
{
min=max;
k=0;
for(j=0;jv;j++)
if(b[j]
{
min=b[j];
k=j;
}
printf(" %c->%c(%d) ",g->vd[a[k]-1],g->vd[k],min);
a[k]=0;
for(j=0;jv;j++)
if(g->sz[k][j]
{
b[j]=g->sz[k][j];
a[j]=k+1;
}
}
} void csh(gre*g,int*a)
{
int i;
for(i=0;ih;i++)
a[i]=i;
} int cz(gre*g,int x,int*a)
{
if(a[x]!=x)
x=cz(g,a[x],a);
return x;
} void hb(int x,int y,int*a)
{
a[x]=y;
} int bcj(gre*g,int i,int j)
{
int n=0,k,a[30]={0};
csh(g,a);
i=cz(g,i,a);
j=cz(g,j,a);
if(i==j)
return 1;
else
{
hb(i,j,a);
return 0;
}
} void krusker(gre*g)
{
int i,j,count=1,k=0,n,a[10][10],b[10],c[10];
for(i=0;iv;i++)
for(j=0;jv;j++)
if(g->sz[i][j]!=max)
{
a[i][j]=g->sz[i][j];
b[k]=g->sz[i][j];
k++;
}
for(i=0;i
for(j=i+1;j
if(b[i]>b[j])
{
n=b[i];
b[i]=b[j];
b[j]=n;
}
k=0;
for(i=0;ih&&countv;i++)
{
for(j=0;jv&&countv;j++)
{
for(n=0;nv&&countv;n++)
if(b[k]==a[j][n])
{
if(!bcj(g,j,n))
{
printf(" %c->%c(%d) ",g->vd[j],g->vd[n],g->sz[j][n]);
count++;
}
break;
}
if(b[k]==a[j][n])
{
a[j][n]=max;
k++;
break;
}
}
}
} void djstl(gre*g)
{
int i,j,k,dis,min,a[20],b[20];
for(i=0;iv;i++)
{
b[i]=g->sz[0][i];
a[i]=0;
}
a[0]=1;
for(i=0;iv;i++)
{
min=max;
for(j=0;jv;j++)
if(!a[j]&&b[j]
{
min=b[j];
k=j;
}
a[k]=1;
for(j=0;jv;j++)
if(!a[j])
{
dis=b[k]+g->sz[k][j];
b[j]=(b[j]
}
}
for(i=0;iv;i++)
printf(" ->%c(%d)",g->vd[i],b[i]);
printf("\n");
} void zylx(gre*g)
{
sd q;
int i,j,k,a[10];
cld(&q);
for(i=0;iv;i++)
a[i]=0;
printf("%c ",g->vd[0]);
a[0]=1;
rrd(&q,0);
while(!ddk(&q))
{
k=ccd(&q);
for(i=0;iv;i++)
if(!a[i]&&g->sz[k][i]!=max)
{
printf("->%c",g->vd[i]);
rrd(&q,i);
a[i]=1;
}
}
printf("\n");
while(q.dw->pre)
{
printf("%c ",g->vd[q.dw->data]);
q.dw=q.dw->pre;
}
printf("\n");
} main()
{
char ch1,ch2;
int i,j;
gre g;
ch1='y';
printf("请选择下列选项!!");
while(ch1=='y'||ch1=='Y')
{
printf("\nA----创建更新图!!\n");
printf("B----图的存储状态!!\n");
printf("C----深度优先遍历!!\n");
printf("D----广度优先遍历!!\n");
printf("E----普里姆算法最短路径!!\n");
printf("F----科鲁斯卡尔算法最短路径!!\n");
printf("G----迪杰斯特拉最短路径!!\n");
printf("H----最优路线!!\n");
printf("I----退出!!\n");
scanf(" %c",&ch2);
switch(ch2)
{
case'A':
case'a':cjgxt(&g);
printf("图创建或更新完成!!\n\n");
break;
case'B':printf("现在存储状态如下:\n");
case'b':tczt(&g);break;
case'C':printf("深度优先遍历!!\n");
case'c':sdyx(&g);break;
case'D':printf("广度优先遍历!!\n");
case'd':gdyx(&g);break;
case'E':printf("普里姆算法最短路径!!\n");
case'e':purim(&g);break;
case'F':printf("科鲁斯卡尔算法最短路径!!\n");
case'f':krusker(&g);break;
case'G':printf("迪杰斯特拉最短路径!!\n");
case'g':djstl(&g);break;
case'H':printf("最优路线!!\n");
case'h':zylx(&g);break;
case'I':printf("退出!!\n");
case'i':exit(1);
default:printf("请选择正确的选项!!\n");
}
printf("结束请按N,继续请按Y\n");
scanf(" %c",&ch1);
}
}