www.pudn.com > ret.rar > ret.cpp


#include 
#include 
#include 
#include 
#include 
 
 
#define MAX_V 100 
#define MAX 10 
#define TURE 1 
#define FALSE 0 
 
 
//城市的名称 
typedef struct{ 
	int vertex1; 
	int vertex2; 
	int weight;  //城市的距离 
    int edge_deleted; 
}Edge;         //两城市间的相关信息 
			  
char vex[MAX][MAX]; 
 
Edge E[MAX_V]; 
 
int total_vertex;  //顶点数  城市的数量 
 
int total_edge;   //边数  两城市的连线数 
 
int adjmatrix[MAX_V][MAX_V];   //以矩阵的形式来表示城市的关系 
 
void kruskal();  //Kruskal算法 
 
void addEdge(Edge);  //用来存入边 
 
void build_adjmatrix();  //用城市的信息存入文件 
 
Edge mincostEdge();  //用来求最小的边 
 
void showEdge();   //用来初始时的显示 
 
void prim(int u);   //prim算法 
 
int minimum();   //Prim算法中求最小边的点 
 
void print()      // 界面输出 
{ 
	cout<<"\t\t#######################################\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t\t  数据结构程序设计\t\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t  本程序由汤徐盛 何学瑾 蔡慧锋完成\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t\t#######################################\n"; 
} 
 
struct{ 
	int adjvex; 
	int lowcost; 
}closedge[MAX_V];  //用定义顶点与距离 
 
void main()    //主函数 
{ 
	printf("\t\t\t数据结构程序设计\n"); 
	printf("\n\n"); 
	cout<<"\t\t#######################################\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t\t  数据结构程序设计\t\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t  本程序由汤徐盛 何学瑾 蔡慧峰完成\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t  ##\t\t\t\t\t\t  ##\n"; 
	cout<<"\t\t####################################\n"; 
	print(); 
	getch(); 
	system("cls"); 
	printf("\n\n"); 
	printf("\t\t利用最小生成树解决最经济的网络连通\n");	 
	printf("\n\n\n\n"); 
	getch(); 
	Edge e; 
	int i, j, weight; 
	build_adjmatrix(); 
    for(i=1;i<=total_vertex;i++)                 //将文件中的值复给边 
		for(j=i+1;j<=total_vertex;j++) 
		{ 
			weight=adjmatrix[i][j];     
			if(weight!=0)                      //将不为零的边存入addEdge中 
			{ 
				e.vertex1=i; 
				e.vertex2=j; 
				e.weight=weight; 
				e.edge_deleted=FALSE; 
				addEdge(e); 
			} 
		} 
	 
	showEdge();	         
	printf("\n"); 
	getch(); 
	printf("由kruskal算法得:\n"); 
	printf("\t\t**********\n"); 
	kruskal();	 
	getch(); 
	printf("\n\n"); 
	printf("prim算法得:\n"); 
	printf("\t\t**********\n"); 
	prim(1); //以顶点V1开始进行prim算法 
	 
}//main 
  
void build_adjmatrix() 
{  
	FILE *fptr; 
	FILE *fp; 
	int vi,vj,i; 
	 
    fptr=fopen("kruskal.txt","r");     //以读的形式打开文件kruskal 
	fp=fopen("name.txt","r");       //以读的形式打开文件kruskal1 
  
	if(fptr==NULL)                  //判断文件kruskal是否为空 
	{ 
		perror("name.txt"); 
		exit(0); 
	} 
	if(fptr==NULL)           //判断文件kruskal1是否为空 
	{ 
		perror("kruskal.txt"); 
		exit(0); 
	} 
    
	fscanf(fptr,"%d",&total_vertex);    //将kruskal文件中的城市的各数存入顶点数中(total_vertex) 
	printf("以下是所需网络连接的城市:\n"); 
	for(i=0;i  V%d    weight=%d\n",E[i].vertex1,E[i].vertex2,E[i].weight); 
		i++; 
	} 
} 
 
 
Edge mincostEdge() 
{ 
	int i,min; 
	long minweight=100000;   
	for(i=0;i<=total_edge;i++) 
	{ 
		if(!E[i].edge_deleted && E[i].weight