标签:next cost info arc class 经典算法 顶点 node cos
Prim算法
void Prim(MatGraph g, int v)
{
int closet[MAXV];
int lowcost[MAXV];
int min;
int i, j, k;
for (i = 0; i < g.n; i++)
{
lowcost[i] = g.edges[v][i];
closet[i] = v;
}
for (i = 1; i < g.n; i++)
{
min = INF;
for (j = 0; j < g.n; j++)
{
if (lowcost[j] != 0 && lowcost[j] < min)
{
min = lowcost[j];
k = j;
}
}
lowcost[k] = 0;
printf("边(%d,%d)权为%d\n", closet[k], k, min);
for (j = 0; j < g.n; j++)
{
if (lowcost[j] != 0 && lowcost[j] > g.edges[k][j])
{
lowcost[j] = g.edges[k][j];
closet[j] = k;
}
}
}
}
Kruskal算法
typedef struct {
int u;
int v;
int w;
}Edge;
void Kruskal(MatGraph g)
{
int i, j, k;
int u1, v1;
int sn1, sn2;
Edge E[MAXV];
int vset[MAXV];
k = 0;
for (i = 0; i < g.n; i++)
{
for (j = 0; j <= i; j++)
{
if (g.edges[i][j] != 0 && g.edges[i][j] != INF)
{
E[k].u = i;
E[k].v = j;
E[k].w = g.edges[i][j];
k++;
}
}
}
insert_sort(E, g.e);
for (i = 0; i < g.n; i++)
vset[i] = i;
k = 1;
j = 0;
while (k < g.n)
{
u1 = E[j].u;
v1 = E[j].v;
sn1 = vset[u1];
sn2 = vset[v1];
if (sn1 != sn2)
{
printf("(%d,%d):%d\n", u1, v1, E[j].w);
k++;
for (i = 0; i < g.n; i++)
{
if (vset[i] == sn2)
vset[i] = sn1;
}
}
j++;
}
}
Dijkstra算法(从一个顶点到其余各顶点的最短路径)
void Dijkstral(MatGraph g, int v)
{
int i, j, u;
int mindist;
int path[MAXV];
int dist[MAXV];
int S[MAXV];
for (i = 0; i < g.n; i++)
{
S[i] = 0;
dist[i] = g.edges[v][i];
if (g.edges[v][i] < INF)
path[i] = v;
else
path[i] = -1;
}
S[v] = 1;
path[v] = 0;
for (i = 1; i < g.n; i++)
{
mindist = INF;
for (j = 0; j < g.n; j++)
{
if (S[j] == 0 && dist[j] < mindist)
{
u = j;
mindist = dist[j];
}
}
S[u] = 1;
for (j = 0; j < g.n; j++)
{
if (S[j] == 0)
{
if (g.edges[u][j] < INF && dist[u] + g.edges[u][j] < dist[j])
{
dist[j] = dist[u] + g.edges[u][j];
path[j] = u;
}
}
}
}
DispPath(g, dist, path, S, v);
}
void DispPath(MatGraph g, int dist[], int path[], int S[], int v)
Floyd算法(每对顶点之间的最短路径)
void Floyd(MatGraph g)
{
int A[MAXV][MAXV];
int path[MAXV][MAXV];
int i, j, k;
for (i = 0; i < g.n; i++)
{
for (j = 0; j < g.n; j++)
{
A[i][j] = g.edges[i][j];
if (i != j && g.edges[i][j] < INF)
path[i][j] = i;
else
path[i][j] = -1;
}
}
for (k = 0; k < g.n; k++)
{
for (i = 0; i < g.n; i++)
{
for (j = 0; j < g.n; j++)
{
if (A[i][j] > A[i][k] + A[k][j])
{
A[i][j] = A[i][k] + A[k][j];
path[i][j] = path[k][j];
}
}
}
}
}
void Dispath(MatGraph g, int A[][MAXV], int path[][MAXV])
{
int apath[MAXV], d;
int i, j, k;
for (i = 0; i < g.n; i++)
{
for (j = 0; j < g.n; j++)
{
if (A[i][j] < INF && i != j)
{
printf("从%d到%d的路径为:", i, j);
d = 0;
apath[d] = j;
k = path[i][j];
while (k != -1 && k != i)
{
apath[++d];
k = path[i][k];
}
apath[++d] = i;
printf("%d", apath[d]);
for (k = d - 1; k >= 0; k--)
printf(",%d", apath[k]);
printf("\t路径长度为:%d\n", A[i][j]);
}
}
}
}
拓扑排序
typedef struct {
InfoType info;
int count;//存放入度
ArcNode* firstarc;
}VNode;
void TopSort(AdjGraph* G)
{
int i, j;
int St[MAXV], top = -1;
ArcNode* p;
for (i = 0; i < G->n; i++)
G->adjlist[i].count = 0;
for (i = 0; i < G->n; i++)
{
p = G->adjlist[i].firstarc;
while (p != NULL)
{
G->adjlist[p->adjvex].count++;
p = p->nextarc;
}
}
for (i = 0; i < G->n; i++)
{
if (G->adjlist[i].count == 0)
St[++top] = i;
}
while (top != -1)
{
i = St[top--];
printf("%d ", i);
p = G->adjlist[i].firstarc;
while (p != NULL)
{
G->adjlist[p->adjvex].count--;
if (G->adjlist[p->adjvex].count == 0)
St[++top] = p->adjvex;
p = p->nextarc;
}
}
}
标签:next cost info arc class 经典算法 顶点 node cos
原文地址:https://www.cnblogs.com/KIROsola/p/11622302.html