C-數據結構-圖-應用

//應用舉例
//計算連通分量
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;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章