最小生成树,普利姆算法和克鲁斯卡尔算法的C语言实现

普利姆算法

#include
#include
#include 
#include 
struct loc                                  //link of connection 的结构体,用来描述某两座城市的线路铺设
{
int city[2];
int money;
};
void SetColor(unsigned short fc=7,unsigned short bc=0)
{
HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,fc+bc*0x10);
}                               
void change(int *p,int *q, int a)           //用来更新V,U集合的状态
{
p[a-1]=1;
q[a-1]=0;
}

void first_pro(int (*p)[6],loc *q,int *v,int *u)
{
int i,j,min=9,a,b;
for(i=0;i<6;i++)	//在图中首先确定最初的两个城市
for(j=0;j

克鲁斯卡尔算法

#include
#include
#include 
#include 
struct loc                                               //link of connection 的结构体,用来描述某两座城市的线路铺设
{
int city[2];
int money;
};
void SetColor(unsigned short fc=7,unsigned short bc=0)
{
HANDLE hCon=GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hCon,fc+bc*0x10);
}

void sort(int (*p)[6],loc *q)	                 //对于路径花费进行排序
{
int i,j,k=0;
loc temp;
for(i=1;i<6;i++)
for(j=0;jq[j+1].money)
{
temp=q[j];
q[j]=q[j+1];
q[j+1]=temp;
}
}
void select(loc *q,int *v,loc *path)
{
int a,b,k,m,n=1,num_s,num_b;
int c=0;
for(k=0;(k<15)&&(c<=5);)
{
a=q[k].city[0];
b=q[k].city[1];
m=q[k].money;
if(v[a]==v[b])                       //判断两个城市是否在同一个集合内
if(v[a]==0)                      //建立一个新的集合
{
v[a]=n;
v[b]=n;
n++;
path[k].city[0]=a;       //建立一条新的路径
path[k].city[1]=b;
path[k].money=m;
c++;
k++;
}
else 
k++;                         //两城市在同一个已有集合内会构成回路,此时判断下一条路径
else
{
num_s=(v[a]v[b])?v[a]:v[b];
for(int i=0;i<6;i++)
if(v[i]==num_b)
v[i]=num_s;
path[k].city[0]=a;           //建立一条新的路径
path[k].city[1]=b;
path[k].money=m;
c++;
k++;
}	
}	


}

void show(loc *p)                                        //显示最终解出的结果
{
int i;
srand(time(NULL));
for(i=0;i<5;i++)
{
int number = rand() % 14 + 1;
SetColor(number,0);
cout<<"城市"<



你可能感兴趣的:(编程)