#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#define MAXV 20
#define INF 65535
typedef struct MatGraph
{
int edge[MAXV][MAXV];
int n,e;
int vex[MAXV];
}MGraph;
typedef struct Arcnode
{
int adjvex;
struct Arcnode *nextarc;
int weight;
}ArcNode;
typedef struct VexNode
{
int data;
int indgree;
ArcNode *firstarc;
}VNode;
typedef struct AdjGraph
{
int n,e;
VNode adjlist[MAXV];
}AGraph;
create_mg_fromMatrix(MGraph *&mg,int a[][MAXV],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];
}
show_mg(MGraph *mg)
{
int i,j;
printf("the mat Graph is :\n");
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");
}
}
int mat_to_adj(MGraph *mg, AGraph *&ag)
{
int i,j;
ArcNode *p;
ag=(AGraph *)malloc(sizeof(AGraph));
ag->n=mg->n;
for(i=0;i<ag->n;i++)
ag->adjlist[i].firstarc=NULL;
for(i=0;i<mg->n;i++)
{
for(j=0;j<mg->n;j++)
if(mg->edge[i][j]!=0&&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 show_adj(AGraph *ag)
{
int i;
ArcNode *p;
printf("Adj Graph is :\n");
for(i=0;i<ag->n;i++)
{
p=ag->adjlist[i].firstarc;
printf("%d : ",i);
while(p!=NULL)
{
printf("-- %d %3d ",p->adjvex,p->weight);
p=p->nextarc;
}
printf("\n");
}
}
adj_to_mat(AGraph *ag,MGraph *&newmg)
{
int i,j;ArcNode *p;
newmg=(MGraph *)malloc(sizeof(MGraph));
newmg->n=ag->n;
for(i=0;i<ag->n;i++)
for(j=0;j<ag->n;j++)
if(i==j)
newmg->edge[i][j]=0;
else
newmg->edge[i][j]=INF;
for(i=0;i<ag->n;i++)
{
p=ag->adjlist[i].firstarc;
while(p!=NULL)
{
newmg->edge[i][p->adjvex]=p->weight;
p=p->nextarc;
}
}
}
int compute_degree_mg(MGraph *mg)
{
int i,j,degree;
for(i=0;i<mg->n;i++)
{
printf("%d dgree is : ",i);
degree=0;
for(j=0;j<mg->n;j++)
if(mg->edge[i][j]!=0&&mg->edge[i][j]!=INF)
degree++;
printf(" %d\n",degree);
}
}
int compute_degree_ag(AGraph *ag)
{
int i,degree;
ArcNode *p;
for(i=0;i<ag->n;i++)
{
printf("%d dgree is : ",i);
degree=0;
p=ag->adjlist[i].firstarc;
while(p!=NULL)
{
degree++;p=p->nextarc;
}
printf(" %d\n",degree);
}
}
int visited[MAXV];
int dfs(AGraph *ag,int v)
{ ArcNode *p;int m;
visited[v]=1;
printf("-%d ",v);
p=ag->adjlist[v].firstarc;
while(p!=NULL)
{
m=p->adjvex;
if(visited[m]==0)
dfs(ag,m);
p=p->nextarc;
}
}
int dfs_traverse(AGraph *ag)
{
int i;
for(i=0;i<ag->n;i++)
visited[i]=0;
printf("\n dfs Graph : ");
for(i=0;i<ag->n;i++)
if(visited[i]==0)
dfs(ag,i);
}
int bfs_traverse(AGraph *ag,int v)
{
int Qu[MAXV];int f,r,i,m,k;ArcNode *p;
f=0,r=0;
for(i=0;i<ag->n;i++)
visited[i]=0;
visited[v]=1;
printf("\n bfs Graph: -%d ",v);
r++;Qu[r]=v;
while(f!=r)
{
f++;m=Qu[f];
p=ag->adjlist[m].firstarc;
while(p!=NULL)
{ k=p->adjvex;
if(visited[k]==0)
{
visited[k]=1;
printf("-%d ",k);
r++;Qu[r]=k;
}
p=p->nextarc;
}
}
}
prim(MGraph *mg,int v)
{
int lowcost[MAXV],adjvex[MAXV];
int i,j,minvalue,k;
for(i=0;i<mg->n;i++)
{
lowcost[i]=mg->edge[v][i];
adjvex[i]=v;
}
lowcost[v]=0;
for(i=0;i<mg->n-1;i++)
{
minvalue=INF;
for(j=0;j<mg->n;j++)
{
if(lowcost[j]!=0&&lowcost[j]<minvalue)
{
k=j;minvalue=lowcost[j];
}
}
lowcost[k]=0;
printf("%d - %d weight %d \n",adjvex[k],k,mg->edge[adjvex[k]][k]);
for(j=0;j<mg->n;j++)
{
if(j!=k&&lowcost[j]!=0&&mg->edge[k][j]<lowcost[j])
{
lowcost[j]=mg->edge[k][j];
adjvex[j]=k;
}
}
}
}
int dijkstra(MGraph *mg,int v)
{
int path[MAXV],finished[MAXV],dist[MAXV];
int i,minvalue,k,j;
for(i=0;i<mg->n;i++)
{
path[i]=v;dist[i]=mg->edge[v][i];finished[i]=0;
}
finished[v]=1;
printf("Dijkstra : %d \n",v);
for(i=0;i<mg->n-1;i++)
{
minvalue=INF;
for(j=0;j<mg->n;j++)
if(finished[j]!=1 && dist[j]<minvalue)
{
k=j;minvalue=dist[j];
}
finished[k]=1;
printf(" %d min dist %d path %d \n",k,dist[k],path[k]) ;
for(j=0;j<mg->n;j++)
if(finished[j]!=1&& dist[k]+mg->edge[k][j] <dist[j])
{
dist[j]= dist[k]+mg->edge[k][j];path[j]=k;
}
}
}
int floyd(MGraph *mg)
{
int i,j,k;
int a[MAXV][MAXV];
int path[MAXV][MAXV];
for(i=0;i<mg->n;i++)
for(j=0;j<mg->n;j++)
a[i][j]=mg->edge[i][j];
for(k=0;k<mg->n;k++)
for(i=0;i<mg->n;i++)
for(j=0;j<mg->n;j++)
if(a[i][k]+a[k][j]<a[i][j])
a[i][j]=a[i][k]+a[k][j];
printf(" flody matrix :\n");
for(i=0;i<mg->n;i++)
{
for(j=0;j<mg->n;j++)
if(a[i][j]==65535)
printf("INF ");
else
printf("%3d ",a[i][j]);
printf("\n") ;
}
}
int main()
{
int a[MAXV][MAXV]={ //UDG
{0,28,INF,INF,INF,10,INF},
{28,0,16,INF,INF,INF,14},
{INF,16,0,12,INF,INF,INF},
{INF,INF,12,0,22,INF,18},
{INF,INF,INF,22,0,25,24},
{10,INF,INF,INF,25,0,INF},
{INF,14,INF,18,24,INF,0}};
int b[MAXV][MAXV]={ //DG
{0, 5,INF,7},
{INF,0, 4,2},
{3, 3, 0,2},
{INF,INF,1,0}};
int i,j,n;
MGraph *mg,*newmg;AGraph *ag;
n=4;
create_mg_fromMatrix(mg,b,n);
show_mg(mg);
mat_to_adj(mg,ag);
show_adj(ag);
floyd(mg);
for(i=0;i<4;i++)
dijkstra(mg,i);
}