#include "stdio.h"
#include "stdlib.h"
#define Maxsize 30
#define INF 65535
int visited[Maxsize];
typedef struct MGraph
{
int vex[Maxsize];
int edge[Maxsize][Maxsize];
int n;
int e;
}mgraph;
typedef struct ArcNode
{
int weight;
int adjvex;
struct ArcNode *nextarc;
}arcnode;
typedef struct VexNode
{
int data;
struct ArcNode *firstarc;
}vexnode;
typedef struct AdjGraph
{
int n;
int e;
vexnode adjlist[Maxsize];
}agraph;
int showMatGraph(MGraph *mg)
{
int i,j;
for(i=0;i<mg->n;i++)
{
for(j=0;j<mg->n;j++)
if(mg->edge[i][j]==INF)
printf("INF ");
else
printf("%3d ",mg->edge[i][j]);
printf("\n");
}
return 1;
}
int createMatGraph(mgraph *&mg,int a[][6],int n)
{
int i,j;
mg=(mgraph *)malloc(sizeof(mgraph));
mg->n=n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
mg->edge[i][j]=a[i][j];
return 1;
}
int matToLinkGraph(mgraph *mg,agraph *&ag)
{
int i,j;
arcnode *p;
ag=(agraph*)malloc(sizeof(agraph));
ag->n=mg->n;
for(i=0;i<mg->n;i++)
{
ag->adjlist[i].firstarc=NULL;
for(j=0;j<mg->n;j++)
{
if(mg->edge[i][j]!=INF)
{
p=(arcnode *)malloc(sizeof(arcnode));
p->weight=mg->edge[i][j];
p->adjvex=j;
p->nextarc=ag->adjlist[i].firstarc;
ag->adjlist[i].firstarc=p;
}
}
}
}
int showAdjGraph(agraph *ag)
{
arcnode *p;
int i;
for(i=0;i<ag->n;i++)
{ printf("%d :",i);
p=ag->adjlist[i].firstarc;
while(p!=NULL)
{
printf("%3d(%d)-> ",p->weight,p->adjvex);
p=p->nextarc;
}
printf("\n");
}
}
int showDegreeMg(mgraph *mg)
{
int degree[Maxsize];
int i,j;
for(i=0;i<mg->n;i++)
{ degree[i]=0;
for(j=0;j<mg->n;j++)
if(mg->edge[i][j]!=INF)
degree[i]++;
}
for(i=0;i<mg->n;i++)
printf("%d ",degree[i]);
printf("\n");
}
int showDegreeAg(agraph *ag)
{
int i;arcnode *p;
int degree[Maxsize];
for(i=0;i<ag->n;i++)
{
degree[i]=0;
p=ag->adjlist[i].firstarc;
while(p!=NULL)
{
degree[i]++;
p=p->nextarc;
}
}
for(i=0;i<ag->n;i++)
printf("%d ",degree[i]);
printf("\n");
}
typedef struct CloseEdge
{
int lowcost;
int adjvex;
}closeEdge;
int showClosedge( closeEdge a[],int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i].adjvex);
printf("\n");
for(i=0;i<n;i++)
printf("%d ",a[i].lowcost);
printf("\n"); printf("\n");
}
int prim_MST(mgraph *mg,int v0)
{
int i,j;
int k,kmin;
closeEdge closedge[Maxsize];
for(i=0;i<mg->n;i++)
{ closedge[i].adjvex=v0;
closedge[i].lowcost=mg->edge[v0][i];
}
closedge[v0].lowcost =0;
showClosedge(closedge,mg->n);
for(i=0;i<mg->n -1;i++)
{ kmin=INF;
for(j=0;j<mg->n;j++)
if(closedge[j].lowcost!=0 && closedge[j].lowcost!=INF && closedge[j].lowcost < kmin)
{
k=j;kmin=closedge[j].lowcost;
}
closedge[k].lowcost=0;
printf("the choosed is %d and %d value %d\n",k,closedge[k].adjvex,kmin);
for(j=0;j<mg->n;j++)
{
if(closedge[j].lowcost!=0 && closedge[j].lowcost>mg->edge[k][j])
{
closedge[j].lowcost = mg->edge[k][j];
closedge[j].adjvex = k;
}
}
showClosedge(closedge,mg->n);
}
}
int dfs(agraph *ag,int v)
{
arcnode *p;
visited[v]=1;
printf("%d ->",v);
p=ag->adjlist[v].firstarc;
while(p!=NULL)
{
if(visited[p->adjvex]==0)
dfs(ag,p->adjvex);
p=p->nextarc;
}
}
int dfs_traverse(agraph *ag)
{
int i;
for(i=0;i<ag->n;i++)
visited[i]=0;
printf("dfs traverse: ");
for(i=0;i<ag->n;i++)
if(visited[i]==0)
dfs(ag,i);
}
int bfs_traverse(agraph *ag,int v)
{
int myqueue[Maxsize];int front,rear;
int i,w;
arcnode *p;
front=0;rear=0;
for(i=0;i<ag->n;i++)
visited[i]=0;
visited[v]=1;
printf("\nbst traverse: %d ->",v);
myqueue[rear++]=v;
while(front!=rear)
{
w=myqueue[front++];
p=ag->adjlist[w].firstarc;
while(p!=NULL)
{
if(visited[p->adjvex]==0)
{
visited[p->adjvex]=1;
printf("%d-> ",p->adjvex);
myqueue[rear++]=p->adjvex;
}
p=p->nextarc;
}
}
}
int dfs_path(agraph *ag,int v0,int v1,int path[],int k,int l)
{
arcnode *p;int t;
visited[v0]=1;
path[k]=v0;
k++;
if(v0==v1&&k==l)
{ for(int i=0;i<k;i++)
printf("%d->",path[i]);
printf("\n");
}
p=ag->adjlist[v0].firstarc;
while(p!=NULL)
{
if(visited[p->adjvex]==0)
t=dfs_path(ag,p->adjvex,v1,path,k,l);
p=p->nextarc;
}
visited[v0]=0;
k--;
}
// check i and j path,and output
int checkPath(agraph *ag,int v0,int v1)
{
int path[Maxsize];
int i,k;
for(i=0;i<ag->n;i++)
visited[i]=0;
printf("\nfind %d to %d path: ",v0,v1);
//for(i=0;i<ag->n;i++)
// if(visited[i]==0)
k=dfs_path(ag,v0,v1,path,0,5);
}
int main()
{
//图7.16存储结构
int a[6][6]={{INF,6,1,5,INF,INF},{6,INF,5,INF,3,INF},{1,5,INF,5,6,4},{5,INF,5,INF,INF,2},{INF,3,6,INF,INF,6},{INF,INF,4,2,6,INF}};
int n=6;
mgraph *mg;
agraph *ag;
createMatGraph(mg,a,n);
showMatGraph(mg);
matToLinkGraph(mg,ag);
showAdjGraph(ag);
showDegreeMg(mg);
showDegreeAg(ag);
prim_MST(mg,0);
dfs_traverse(ag);
bfs_traverse(ag,0);
return 1;
}