//克鲁斯卡尔算法(适合于稀疏图)
void Kruskal(edgeset GE,edgeset C, int n)
{
int i,j,k,d;
int m1,m2;
adjmatrix s;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
if(i==j)
s[i][j]=1;
else
s[i][j]=0;
}
k=1;
d=0;
while(k<n)
{
for(i=0;i<n;i++)
{
if(s[i][GE[d].fromvex]==1)
m1=i;
if(s[i][GE[d].endvex]==1)
m2=i;
}
if(m1!=m2)
{
C[k-1]=GE[d];
k++;
for(j=0;j<n;j++)
{
s[m1][j]=s[m1][j] || s[m2][j];
s[m2][j]=0;
}
}
d++;
}
}
//普利姆算法(适合于稠密图)
void Prim(adjmatrix GA,edgeset CT,int a,int n)
{
int i,j,k,min,t,m,w;
struct edgeElem x;
for(i=0;i<n;i++)
{
if(i<a)
{
CT[i].fromvex=a;
CT[i].endvex=i;
CT[i].weight=GA[a][i];
}
else if(i>a)
{
CT[i-1].fromvex=a;
CT[i-1].endvex=i;
CT[i-1].weight=GA[a][i];
}
}
for(k=1;k<n;k++)
{
min=MaxValue;
m=k-1;
for(j=k-1;j<n-1;j++)
if(CT[j].weight<min)
{
min=CT[j].weight;
m=j;
}
x=CT[k-1];
CT[k-1]=CT[m];
CT[m]=x;
j=CT[k-1].endvex;
for(i=k;i<n-1;i++)
{
t=CT[i].endvex;
w=GA[j][t];
if(w<CT[i].weight)
{
CT[i].weight=w;
CT[i].fromvex=j;
}
}
}
}
/*冒泡_下沉*/
int i,j;
for(i=0;i<n;n--)
for(j=i;j<n-1;j++)
{
if(a[j]<a[j+1]) 交换;
}
/*冒泡_起泡*/
for(i=0;i<n;i++)
for(j=n-1;j>=0;--)
if(a[j]>a[j-1] 交换;
/*选择排序*/
void select_sort(int *a,int n)
{//从大到小
int i,j,k,temp;
for(i=0;i<n;i++)
{
k=i;
for(j=i+1;j<n;j++)
{
if(a[k]<a[j])
k=j;
}
if(k!=i)
{
temp=a[i];
a[i]=a[k];
a[k]=temp;
}
}
}
/*快速排序*/
void QuickSort(int a[], int s, int t)
{
int i=s,j=t+1;
int temp=a[s];
do
{
do
i++;
while(a[i]<temp);
do
j--;
while(a[j]>temp);
if(i<j)
{
int t;
t=a[i];
a[i]=a[j];
a[j]=t;
}
}while(i<j);
a[s]=a[j];
a[j]=temp;
if(s<j-1)
QuickSort(a,s,j-1);
if(t>j+1)
QuickSort(a,j+1,t);
}
/* 拓扑排序
* (activity on vertex network) AOV网
*/
void Toposort(adjlist GL, int n)
{
int i,j,k,top,m=0;
struct edgenode*p;
int* d=(int*)malloc(n*sizeof(int));
for(i=0;i<n;i++)
d[i]=0;
for(i=0;i<n;i++)
{
p=GL[i];
while(p!=NULL)
{
j=p->adjvex;
d[j]++;
p=p->next;
}
}
top=-1;
for(i=0;i<n;i++)
if(d[i]==0)
{
d[i]=top;
top=i;
}
while(top!=-1)
{
j=top;
top=d[top];
printf("%d ",j);
m++;
p=GL[j];
while(p!=NULL)
{
k=p->a