//应用举例
//计算连通分量
int visited[vnum];
Count_Component (Graph g)
{
int count,v;
for (v=0;v<g.vexnum;v++)
visited[v]=0;
count=0;
for (v=0;v<g.vexnum;v++)
if (!visited[v])
{
count++;
printf("连通分量%d包含以下顶点:",count);
Dfs (g,v);
printf("\n");
}
printf("共有%d个连通分量\n",count);
}
//最小生成树
//Prim算法
const int MAX_INT=32767;
typedef struct gp
{
int vexs[vnum];
int arcs[vnum][vnum];
int vexnum,arcnum;
}Graph;
struct//记录U到V-U中最小权值和顶点
{
int adjvex;
int lowcost;
}closedeg[vnum];
Prim(Graph g,int u)
{
int v,k,j,min;
for (v=0;v<g.vexnum;v++)//初始化
if (v!=u)
{
closedge[v].adjvex=u;
closedge[v].lowcost=g.arcs[u][v];//将邻接矩阵中与u相关的的权导入到closedge[vnum]中
}
closedge[u].lowcost=MAX_INT;
for (k=0;k<g.vexnum;k++)
{
min=closedge[k].lowcost;
v=k;
for (j=0;j<g.vexnum;j++)//找真正最小权值边
if (closedge[j].lowcost<min)
{
min=closedge[j].lowcost;
v=j;
}
printf("%d %d\n",closedge[v].adjvex,v);//输出生成树边
closedge[v].lowcost=MAX_INT;//v加入U
for (j=0;j<g.vexnum;j++)
if (g.arcs[v][j]<closedge[j].lowcost)
{
closedge[j].lowcost=g.arcs[v][j];
closedge[j].adjvex=v;
}
}
}
//拓扑排序-邻接表
const int vnum=20;
typedef struct arcnode
{
int adjvex;
struct arcnode *nextarc;
}ArcNode;
typedef struct vexnode
{
VertexType vertex;
int in;//记录入度
ArcNode *firstarc;
}AdjList [vnum]
typedef struct gp
{
AdjList adjlist;
int vexnum,arcnum;
}Graph;
Tp_Sort (Graph g)
{
LkStk *S;
ArcNode *p;
int m,i,v;
InitStack(S);
for (i=0;i<g.vexnum;i++)
if (g.adjlist[i].in==0)
Push (S,i);
m=0;
while (!EmptyStack(S))
{
v=Gettop(S);
Pop(S);
printf ("%d",v);
m++;//输出节点数+1
p=g.adjlist[v].firstarc;
while (p!=NULL)
{
(g.adjlist[p->adjvex].in)--;//入度-1
if (g.adjlist[p->adjvex].in==0)
Push(S,p->adjvex);
p=p->nextarc;
}
}
if (m<g.vexnum)
return 0; //有环
else
return 1;
}