#include<stdio.h>
typedef struct MGraph
{
int vertex[10],arc[10][10];
int vertexNum,arcNum;
}MGraph;
MGraph G;
int visited1[10]={0};
int visited2[10]={0};
void InitMGraph(MGraph *G) //建立无向图
{
int i,j,k;
printf("请输入顶点的个数和边数:\n");
scanf("%d,%d",&G->vertexNum,&G->arcNum);
printf("请输入%d个顶点的信息:\n",G->vertexNum);
for(i=0;i<G->vertexNum;i++)
{
scanf("%d",&G->vertex[i]);
}
printf("请输入边的信息:\n");
for(i=0;i<G->vertexNum;i++)
{
for(j=0;j<G->vertexNum;j++)
{
G->arc[i][j]=0;
}
}
for(k=0;k<G->arcNum;k++)
{
scanf("%d,%d",&i,&j);
G->arc[i-1][j-1]=1;
G->arc[j-1][i-1]=1;
}
}
void Degree(MGraph *G) //查询度
{
int i,j,count=0;
char k;
do
{
printf("\n请输入待查询度的顶点:\t");
scanf("%d",&i);
for(j=0;j<G->vertexNum;j++)
{
if(G->arc[i-1][j]==1)
{
count++;
}
}
printf("第%d个顶点的度为%d\n",i,count);
count=0;
printf("是否继续查询?Y/N\t");
getchar();
scanf("%c",&k);
}while(k=='Y');
}
void Arc(MGraph *G) //查询边
{
int a,b;
char k;
do
{
printf("\n请输入你想查询是否存在边的两点:\t");
scanf("%d,%d",&a,&b);
if(G->arc[a-1][b-1]==1) printf("存在\n");
else printf("不存在\n");
printf("是否继续查询?Y/N\t");
getchar();
scanf("%c",&k);
}while(k=='Y');
}
void Deep(MGraph *G,int v) //深度遍历
{
int j;
printf("%d\t",G->vertex[v]);
visited1[v] = 1;
for (j = 0; j <G->vertexNum; j++)
if (G->arc[v][j] == 1 && visited1[j] == 0)
Deep(G,j);
}
void Wide(MGraph *G, int v) //广度遍历
{
int j,front=-1,rear=-1,Q[10];
printf("%d\t",G->vertex[v]);
visited2[v] = 1;
Q[++rear] = v;
while (front != rear)
{
v = Q[++front];
for (j = 0; j <G->vertexNum; j++)
if (G->arc[v][j] == 1 && visited2[j] == 0 )
{
printf("%d\t",G->vertex[j]);
visited2[j] = 1;
Q[++rear] = j;
}
}
}
int main()
{
int i,j,a,v;
InitMGraph(&G);
for(i=0;i<G.vertexNum;i++)
{
printf("\n");
for(j=0;j<G.vertexNum;j++)
{
printf("%3d",G.arc[i][j]);
}
}
do
{
printf("\n请输入你想进行的操作序号\n1.查询顶点的度\n2.查询顶点之间是否存在边\n3.深度优先遍历\n4.广度优先遍历\n0.结束\n\n");
scanf("%d",&a);
switch(a)
{
case 0: exit(0);
case 1: Degree(&G); break;
case 2: Arc(&G); break;
case 3: v=0;Deep(&G,v);break;
case 4: v=0;Wide(&G,v);break;
default: printf("输入错误,请重新输入\n");break;
}
}while(a!=0);
return 0;
}