#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define max 80
#define INFINITY 1048576
typedef struct {
int distance;
int path;
}dist;
typedef struct {
int vj;
int weight;
}edge;
typedef struct {
char data[max][max];
int weight[max][max];
int vertexnum,arcnum;
}mgraph;
int crt(mgraph *G){
int i=0,j=0;
scanf("%d %d",&G->vertexnum,&G->arcnum);
for(i=0;i<G->vertexnum;i++){
scanf("%s",G->data[i]);
}
for(i=0;i<G->vertexnum;i++){
for(j=0;j<G->vertexnum;j++){
G->weight[i][j]=0;
}
}
char s1[max],s2[max];
int weight,m = 0,n = 0;
for(i=0;i<G->arcnum;i++){
scanf("%s %s %d",s1,s2,&weight);
for(j=0;j<G->vertexnum;j++){
if(strcmp(s1,G->data[j])==0)m=j;
if(strcmp(G->data[j],s2)==0)n=j;
}
G->weight[m][n]=G->weight[n][m]=weight;
}
return G->vertexnum;
}
void output(mgraph G){
int i,j;
for(i=0;i<G.vertexnum;i++){
printf("%s ",G.data[i]);
}
putchar('\n');
for(i=0;i<G.vertexnum;i++){
for(j=0;j<G.vertexnum;j++){
printf("%5d",G.weight[i][j]);
}
putchar('\n');
}
}
void DFS(mgraph G,char str[],int visited[]){
int j=0,v = 0;
for(j=0;j<G.vertexnum;j++){
if(strcmp(str,G.data[j])==0)v=j;
}
printf("%s ",G.data[v]);
visited[v]=1;
for(j=0;j<G.vertexnum;j++){
if(G.weight[v][j]!=0&&visited[j]==0)DFS(G,G.data[j],visited);
}
}
void BFS(mgraph G,char str[],int visited[]){
int i,j=0,v = 0,flag;
for(j=0;j<G.vertexnum;j++){
if(strcmp(str,G.data[j])==0)v=j;
}
if(visited[v]==0){
printf("%s ",G.data[v]);
visited[v]=1;
}
for(j=0;j<G.vertexnum;j++){
if(G.weight[v][j]!=0&&visited[j]==0){
printf("%s ",G.data[j]);
visited[j]=1;
}
}
for(j=0;j<G.vertexnum;j++){
flag=0;
if(G.weight[v][j]!=0){
for(i=0;i<G.vertexnum;i++){
if(visited[i]==0){
flag=1;
break;
}
}
if(flag)BFS(G,G.data[j],visited);
}
}
return ;
}
int select(mgraph G,edge lowcost[],int *m,int flag[]){
int i,temp=lowcost[0].weight,v = 0;
for(i=0;i<G.vertexnum;i++){
if((!(flag[i]==1&&flag[lowcost[i].vj]==1))&&temp>lowcost[i].weight){
temp=lowcost[i].weight;
v=i;
(*m)=lowcost[i].vj;
}
}
return v;
}
void prim(mgraph G,edge lowcost[]){
int v=0,i,j,k=v,flag[G.vertexnum];
for(i=0;i<G.vertexnum;i++){
for(j=0;j<G.vertexnum;j++){
if(G.weight[i][j]==0)G.weight[i][j]=INFINITY;
}
}
for(i=0;i<G.vertexnum;i++){
flag[i]=0;
lowcost[i].weight=G.weight[v][i];
if(lowcost[i].weight==INFINITY)lowcost[i].vj=-1;
else lowcost[i].vj=v;
}
flag[v]=1;
for(i=0;i<G.vertexnum-1;i++){
k=select(G,lowcost,&v,flag);
printf("%s-%s %d\n",G.data[v],G.data[k],G.weight[v][k]);
flag[k]=1;
for(j=0;j<G.vertexnum;j++){
if(flag[j]==0&&G.weight[k][j]<lowcost[j].weight){
lowcost[j].weight=G.weight[k][j];
lowcost[j].vj=k;
}
}
}
return ;
}
int select1(mgraph G,dist dist[],int flag[]){
int i,temp = 0,v = 0;
for(i=0;i<G.vertexnum;i++){
if(flag[i]==0){
temp=dist[i].distance;
v=i;
break;
}
}
for(i=0;i<G.vertexnum;i++){
if((flag[i]==0)&&temp>dist[i].distance){
temp=dist[i].distance;
v=i;
}
}
return v;
}
void dijkstra(mgraph G,dist dist[],char str[]){
int flag[G.vertexnum];
int v = 0,i,j,k;
for(i=0;i<G.vertexnum;i++){
if(strcmp(str,G.data[i])==0){
v=i;
break;
}
}
for(i=0;i<G.vertexnum;i++){
flag[i]=0;
for(j=0;j<G.vertexnum;j++){
if(i==j)continue;
if(G.weight[i][j]==0)G.weight[i][j]=INFINITY;
}
}
for(j=0;j<G.vertexnum;j++){
dist[j].distance=G.weight[v][j];
if(dist[j].distance==INFINITY||j==v)dist[j].path=-1;
else dist[j].path=v;
}
flag[v]=1;
for(i=0;i<G.vertexnum-1;i++){
k=select1(G,dist,flag);
flag[k]=1;
for(j=0;j<G.vertexnum;j++){
if(flag[j]==0&&dist[k].distance+G.weight[k][j]<dist[j].distance){
dist[j].distance=dist[k].distance+G.weight[k][j];
dist[j].path=k;
}
}
}
for(i=0;i<G.vertexnum;i++){
printf("%s %d\n",G.data[i],dist[i].distance);
}
return ;
}
int main(){
char ch,str[max];
mgraph G;
int i,vertexnum = 0,visited[max]={0};
edge lowcost[max];
dist dist[max];
while(1){
ch=getchar();
switch(ch){
case 'c':
vertexnum=crt(&G);
break;
case 'o':
output(G);
break;
case 'd':
for(i=0;i<vertexnum;i++){
visited[i]=0;
}
scanf("%s",str);
DFS(G,str,visited);
putchar('\n');
break;
case 'b':
for(i=0;i<vertexnum;i++){
visited[i]=0;
}
scanf("%s",str);
BFS(G,str,visited);
putchar('\n');
break;
case 'p':
prim(G,lowcost);
break;
case 'j':
scanf("%s",str);
dijkstra(G,dist,str);
break;
case 'q':
printf("程序退出\n");
exit(0);
}
}
return 0;
}
【问题描述】
带权无向图(连通或不连通都要支持)采用邻接矩阵进行存储,图中顶点的类型为字符串,完成以下操作:
1.创建图的邻接矩阵
2.输出图的顶点和邻接矩阵
3.从指定的源点出发进行深度优先遍历
4.从指定的源点出发进行广度优先遍历
5.基于PRIM算法构造图的最小生成树
6.迪杰斯特拉求最短路径
注意:c为创建图的邻接矩阵;o为输出图的顶点和邻接矩阵;d为深度优先遍历;b为广度优先遍历;p为PRIM算法;j为迪杰斯特拉算法;q程序退出
操作一:
【样例输入】
c
5 7//5是顶点数量,7是边的数量
A B C D E//顶点名称
A B 10//边的权值
A D 30
A E 100
B C 50
C D 20
C E 10
D E 60
o
q
【样例输出】
A B C D E
0 10 0 30 100
10 0 50 0 0
0 50 0 20 10
30 0 20 0 60
100 0 10 60 0
程序退出
邻接矩阵printf("%5d")
操作2:
【样例输入】
c
5 7
A B C D E
A B 10
A D 30
A E 100
B C 50
C D20
C E 10
D E 60
d
B
q
【样例输出】
B A D C E
程序退出
操作3
【样例输入】
c
5 7
A B C D E
A B 10
A D 30
A E 100
B C 50
C D 20
C E 10
D E 60
b
A
q
【样例输出】
A B D E C
程序退出
操作4
输入略
p
q
【样例输出】
A-B 10
A-D 30
D-C 20
C-E 10
程序退出
操作5:
输入略
j
A
q
【样例输出】
A 0
B 10
C 50
D 30
E 60
程序退出