#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>
#define Max 30
typedef struct{
char dian[Max];
int bian[Max][Max];
int d,b;
}ljt;
typedef struct{
int elem;
char p[30];
}data;
typedef struct{
char dian[Max];
data bian[Max][Max];
int d,b;
}ljt1;
typedef struct{
int data[30];
int r,f,size;
}queue;
/*
求最小生成树(无向网,普里姆算法)
单一源点到其余各点的最短路径(有向网,迪杰斯特拉算法)
各点到其他点的最短路径(有向网,弗洛伊德算法)
*/
void creat1(ljt &G);//无向图
void creat2(ljt &G);//有向图
void creat3(ljt &G);//无向网
void creat4(ljt1 &G);//有向网
void disp1(ljt G);// 显示
void disp2(ljt1 G);// 显示有向图
void deep(ljt G,int v,int visit[]);//深度遍历
void deep1(ljt G,int visit[]);//非联通
void wide(ljt G,int v,int visit[]);//广度遍历
void wide1(ljt G,int visit[]);//广度遍历 非联通
void init(queue &Q);
void push(queue &Q,int e);
void pop(queue &Q,int &e);
int empty(queue Q);
void init(queue &Q){
Q.f=Q.r=0;
Q.size=30;
}
void push(queue &Q,int e){
if((Q.r+1)%Q.size!=Q.f){
Q.data[Q.r]=e;
Q.r=(Q.r+1)%Q.size;
}
}
void pop(queue &Q,int &e){
if(Q.f!=Q.r){
e=Q.data[Q.f];
Q.f=(Q.f+1)%Q.size;
}
}
int empty(queue Q){
if(Q.f==Q.r)return 1;
else return 0;
}
void creat1(ljt &G){// 无向图
int i,j,k;
printf("请输入顶点数和边数:\n");
scanf("%d %d",&G.d,&G.b);
fflush(stdin);
for(i=0;i<G.d;i++){
printf("请输入第%d个顶点的信息:",i+1);
scanf("%c",&G.dian[i]);
fflush(stdin);}
for(i=0;i<G.d;i++)
for(j=0;j<G.d;j++) G.bian[i][j]=0;
for(k=0;k<G.b;k++){
printf("请输入第%d边依附的两个顶点的序号:",k+1);
scanf("%d %d",&i,&j);
G.bian[i-1][j-1]=1;G.bian[j-1][i-1]=1;
}
}
void creat2(ljt &G){//有向图
int i,j,k;
printf("请输入顶点数和边数:\n");
scanf("%d %d",&G.d,&G.b);
fflush(stdin);
for(i=0;i<G.d;i++){
printf("请输入第%d个顶点的信息:",i+1);
scanf("%c",&G.dian[i]);
fflush(stdin);}
for(i=0;i<G.d;i++)
for(j=0;j<G.d;j++) G.bian[i][j]=0;
for(k=0;k<G.b;k++){
printf("请输入第%d边依附的两个顶点的序号:",k+1);
scanf("%d %d",&i,&j);
G.bian[i-1][j-1]=1;
}
}
void creat3(ljt &G){//无向网
int i,j,k,w;
printf("请输入顶点数和边数:\n");
scanf("%d %d",&G.d,&G.b);
fflush(stdin);
for(i=0;i<G.d;i++){
printf("请输入第%d个顶点的信息:",i+1);
scanf("%c",&G.dian[i]);
fflush(stdin);}
for(i=0;i<G.d;i++)
for(j=0;j<G.d;j++) {
if(i==j)G.bian[i][j]=0;
else G.bian[i][j]=999;
}
for(k=0;k<G.b;k++){
printf("请输入第%d边依附的两个顶点的序号和权值:",k+1);
scanf("%d %d %d",&i,&j,&w);
G.bian[i-1][j-1]=w;G.bian[j-1][i-1]=w;
}
}
void creat4(ljt1 &G){//有向网
int i,j,k,w;
char s[30];
printf("请输入顶点数和边数:\n");
scanf("%d %d",&G.d,&G.b);
fflush(stdin);
for(i=0;i<G.d;i++){
printf("请输入第%d个顶点的信息:",i+1);
scanf("%c",&G.dian[i]);
fflush(stdin);}
for(i=0;i<G.d;i++)
for(j=0;j<G.d;j++) {
if(i==j) G.bian[i][j].elem=0;
else G.bian[i][j].elem=999;
strcpy(G.bian[i][j].p,"#");
}
for(k=0;k<G.b;k++){
printf("请输入第%d边依附的两个顶点的序号和权值及注释:",k+1);
scanf("%d %d %d%s",&i,&j,&w,s);
fflush(stdin);
G.bian[i-1][j-1].elem=w;
strcpy(G.bian[i-1][j-1].p,s);
getch();
}
}
void deep1(ljt G,int visit[]){//非联通
int i;
for(i=0;i<G.d;++i)
visit[i]=0;
for(i=0;i<G.d;++i)
if(visit[i]==0) deep(G,i,visit);
}
void disp1(ljt G){// 显示
int i,j,k;
for(i=0;i<G.d;i++)
printf("%c ",G.dian[i]);
printf("\n");
for(j=0;j<G.b;j++){
for(k=0;k<G.b;k++)
printf("%d ",G.bian[j][k]);
printf("\n");
}
}
void disp2(ljt1 G){// 显示
int i,j,k;
for(i=0;i<G.d;i++)
printf("%10c ",G.dian[i]);
printf("\n");
for(j=0;j<G.b;j++){
for(k=0;k<G.b;k++){
printf("%d 注释:",G.bian[j][k].elem);getch();
if(strcmp(G.bian[j][k].p,"#")==0)printf("** ");
else {printf("%s",G.bian[j][k].p);printf(" ");}
}
printf("\n");
}
}
void deep(ljt G,int v,int visit[]){//深度遍历
int j;
printf("%c ",G.dian[v]);
visit[v]=1;
for(j=0;j<G.d;j++)
if(G.bian[v][j]==1&&visit[j]==0)
deep(G,j,visit);
}
void wide(ljt G,int v,int visit[]){//广度遍历
queue Q;init(Q);
int j;
printf("%c ",G.dian[v]);visit[v]=1;push(Q,v);
while(!empty(Q)){
pop(Q,v);
for(j=0;j<G.d;j++)
if(G.bian[v][j]==1&&visit[j]==0){
printf("%c ",G.dian[j]);visit[j]=1;push(Q,j);
}
}
}
void wide1(ljt G,int visit[]){//广度遍历 非联通
int v;
for(v=0;v<G.d;++v)
visit[v]=0;
for(v=0;v<G.d;++v)
if(visit[v]==0)wide(G,v,visit);
}
void main(){
int visit[30];
ljt G;
creat2(G);
disp1(G);
wide1(G,visit);
}
#include<stdio.h>
#include<string.h>
#include<s