#include <stdio.h>
#include <string.h>
#include <stdlib.h>
//
定义有关图所能用到的信息
#define MAX_VERTEX_NUM 20
#define MAX_Name 10
typedef char VertexType[MAX_Name];
typedef int AdiMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
typedef struct MGraph
{
VertexType vexs[MAX_VERTEX_NUM];
AdiMatrix arcs;
int vexnum,arcnum;
};
typedef struct
{
VertexType adjvex;
int lowcost;
}miniside[MAX_VERTEX_NUM];
struct st
{
VertexType vex1;
VertexType vex2;
int cost;
}store[10];
//
条件:如果
G
存在,
u
和
G
中的顶点具有相同的特征
//
结果:若
G
中存在顶点
u
,则返回该顶点在图中的位置,若否,则返回
-1
。
int LocateVex(MGraph G,VertexType u)
{
int i;
for(i=0;i<G.vexnum;++i)
if(strcmp(u,G.vexs[i])==0)
return i;
return -1;
}
//
输入各个城市名称以及城市之间可以修的网络通讯线路的条数
//
输入各个城市之间的网络通讯线路建设时的造价
//
这里运用的是建立无向图
UDG
表示的是无向图
void CreateUDG(MGraph &G)
{
int i,j,k,l;
VertexType va,vb;
printf("
请输入所有城市的数量、城市之间可修的网络通讯线路条数
:/n");
scanf("%d %d",&G.vexnum,&G.arcnum);
printf("
请输入城市名字:
/n");
for(i=0;i<G.vexnum;i++)
scanf("%s",G.vexs[i]);
for(i=0;i<G.vexnum;++i)
for(j=0;j<G.vexnum;++j)
G.arcs[i][j]=0x7fffffff;
printf("
请输入
%d
个城市名称和通讯网络建设造价:
/n",G.arcnum);
printf("/n");
printf(" A
市
B
市
费用
/n");
for(k=0;k<G.arcnum;++k)
{
scanf("%s %s %*c",va,vb,&l);
i=LocateVex(G,va);
j=LocateVex(G,vb);
G.arcs[i][j]=G.arcs[j][i]=l;
}
return;
}
//
克鲁斯卡尔算法实现寻找图的最小生成树。
void kruskal(MGraph G)
{
int set[MAX_VERTEX_NUM],i,j,value;
int k=0,b=0,a=0,min=G.arcs[a][b];
for(i=0;i<G.vexnum;i++)
set[i]=i;
printf("/n");
printf("
最低经济代价通讯方法:
/n");
while(k<G.vexnum-1)
{
for(i=0;i<G.vexnum;++i)
for(j=i+1;j<G.vexnum;++j)
if(G.arcs[i][j]<min)
{
min=G.arcs[i][j];
a=i;
b=j;
value=G.arcs[i][j];
}
//0x7fffffff
表示的是无穷大
min=G.arcs[a][b]=0x7fffffff;
if(set[a]!=set[b])
{
printf("%s-%s/n",G.vexs[a],G.vexs[b]);
k++;
for(i=0;i<G.vexnum;++i)
if(set[i]==set[b])
set[i]=set[a];
}
//
在这里城市和城市之间建立连接,并寻找最小生成树
store[k].vex1=G.vexs[a];
store[k].vex2=G.vexs[b];
store[k].cost=value;
}
return;
}
//
函数用来暂停一下程序的运行。使用户可以看清楚屏幕上的内容。而不至于直接跳转到下面
//
的内容。
void pause (void)
{
fflush(stdin);
printf("Press Enter to go on......");
getchar();
return;
}
//
信息的保存
void save(MGraph G)
{
FILE *fp;
int i;
//
保存在
eleven.txt
文件中
if((fp=fopen("eleven.txt","wb"))==NULL)
{
printf("Sava Error.../n");
exit(1);
}
for(i=0;i<10;i++)
fwrite(&store[i],sizeof(struct st),1,fp);
fclose(fp);
printf("Save Completed.../n");
pause();
}
//main
主函数。
int main()
{
MGraph g;
CreateUDG(g);
kruskal(g);
save(g);
//
原本在这里想用选择的方式让用户选择自己想要的服务:信息的存储和读取,但是由于本次
//
实验不要求读取而且如果加上这部分的功能以后却无法显示出读取后的信息,而且在本菜单
//
前面是有信息的输入的。因此如果加上这部门功能后使这个程序看起来乱乱的,所以最后还
//
是去掉了。
/*printf("------------------/n");
printf("1
信息存储
/n");
printf("2
读取信息
/n");
printf("3
退出
/n");
printf("------------------/n");
int selNo;
printf("
请输入你的选择:
/n");
scanf("%d",&selNo);
switch(selNo)
{
case 1:
save(g);
return 1;
break;
case 2:
read(g);
return 2;
break;
case 0:
return 0;
break;
default:
printf("Input Error
!
");
pause();
return selNo;
break;
} */
return 0;
}
这个也是上学期做数据结构实验的时候写的..求几个城市之间的最短路径..