70,020
社区成员




#include "stdio.h"
#include "stdlib.h"
#define MAX 20
#define INFINITY 9999
typedef bool PathMatrix[MAX+1][MAX+1];
typedef int ShortPathTable[MAX+1];
typedef struct
{
int vexnum,arcnum;
char vexs[MAX+1];
int arcs[MAX+1][MAX+1];
}MGraph;
void CreateDN(MGraph &G)
{
int i,j,k,v1,v2,w;
printf("请输入顶点数和边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
getchar();
printf("请输入第%d个结点:",i);
scanf("%c",&G.vexs[i]);
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INFINITY;
for(k=0;k<G.arcnum;k++)
{
printf("请输入边----源点,终点,权值:");
scanf("%d %d %d",&v1,&v2,&w);
G.arcs[v1][v2]=w;
}
}
void ShortestPath_DIJ(MGraph G,int v0,PathMatrix &p,ShortPathTable &D)
{
int v,w,i,min;
bool final[MAX+1];
for(v=0;v<G.vexnum;v++)
{
final[v]=false;
D[v]=G.arcs[v0][v];
for(w=0;w<G.vexnum;w++)
p[v][w]=false;
if (D[v]<INFINITY)
{
p[v][v0]=true;
p[v][v]=true;
}
}
D[v0]=0;
final[v0]=true;
for(i=1;i<G.vexnum;i++)
{
min=INFINITY;
for(w=0;w<G.vexnum;w++)
if (!final[w])
{
if (D[w]<min)
{
v=w;
min=D[w];
}
}
final[v]=true;
for(w=0;w<G.vexnum;w++)
if (!final[w]&&(min+G.arcs[v][w]<D[w]))
{
D[w]=min+G.arcs[v][w];
for(i=0;i<G.vexnum;i++)
p[w][i]=p[v][i];
p[w][w]=true;
}
}
}
void main()
{
MGraph G;
int i,j;
CreateDN(G);
PathMatrix p;
ShortPathTable D;
ShortestPath_DIJ(G,0,p,D);
for(i=0;i<G.vexnum;i++)
{
printf("0到顶点%d的最短路径为:\n",i);
for(j=0;j<G.vexnum;j++)
printf("%d ",p[i][j]);
printf("代价为:%d\n",D[i]);
printf("\n");
}
}
#include "stdio.h"
#include "stdlib.h"
#define MAX 20
#define INFINITY 9999
typedef bool PathMatrix[MAX+1][MAX+1];
typedef int ShortPathTable[MAX+1];
typedef struct
{
int vexnum,arcnum;
char vexs[MAX+1];
int arcs[MAX+1][MAX+1];
}MGraph;
void CreateDN(MGraph &G)
{
int i,j,k,v1,v2,w;
printf("请输入顶点数和边数:");
scanf("%d %d",&G.vexnum,&G.arcnum);
for(i=0;i<G.vexnum;i++)
{
getchar();
printf("请输入第%d个结点:",i);
scanf("%c",&G.vexs[i]);
}
for(i=0;i<G.vexnum;i++)
for(j=0;j<G.vexnum;j++)
G.arcs[i][j]=INFINITY;
for(k=0;k<G.arcnum;k++)
{
printf("请输入边----源点,终点,权值:");
scanf("%d %d %d",&v1,&v2,&w);
G.arcs[v1][v2]=w;
}
}
void ShortestPath_DIJ(MGraph G,int v0,PathMatrix &p,ShortPathTable &D)
{
int v,w,i,min,j;
bool final[MAX+1];
for(v=0;v<G.vexnum;v++)
{
final[v]=false;
D[v]=G.arcs[v0][v];
for(w=0;w<G.vexnum;w++)
p[v][w]=false;
if (D[v]<INFINITY)
{
p[v][v0]=true;
p[v][v]=true;
}
}
D[v0]=0;
final[v0]=true;
for(i=1;i<G.vexnum;i++)
{
min=INFINITY;
for(w=0;w<G.vexnum;w++)
if (!final[w])
{
if (D[w]<min)
{
v=w;
min=D[w];
}
}
final[v]=true;
for(w=0;w<G.vexnum;w++)
if (!final[w]&&(min+G.arcs[v][w]<D[w]))
{
D[w]=min+G.arcs[v][w];
for(j=0;j<G.vexnum;j++)
p[w][j]=p[v][j];
p[w][w]=true;
}
}
}
void main()
{
MGraph G;
int i,j;
CreateDN(G);
PathMatrix p;
ShortPathTable D;
ShortestPath_DIJ(G,0,p,D);
for(i=0;i<G.vexnum;i++)
{
printf("0到顶点%d的最短路径为:\n",i);
for(j=0;j<G.vexnum;j++)
printf("%d ",p[i][j]);
printf("代价为:%d\n",D[i]);
printf("\n");
}
}
for(i=1;i<G.vexnum;i++)
{
min=INFINITY;
for(w=0;w<G.vexnum;w++)
if (!final[w])
{
if (D[w]<min)
{
v=w;
min=D[w];
}
}
final[v]=true;
for(w=0;w<G.vexnum;w++)
if (!final[w]&&(min+G.arcs[v][w]<D[w]))
{
D[w]=min+G.arcs[v][w];
for(j=0;j<G.vexnum;j++)//原本写成了i,跟第一个外循环重了
p[w][j]=p[v][j];
p[w][w]=true;
}
}