最小生成树Prim算法 并行程序

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

// li.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include
#include "omp.h"
#include
#define AdjMatrix int
#define VertexType char
#define INFINITY 10000
#define Max_Vertex_Num 100
typedef enum{ DN,UDN}Graphkind;
typedef struct{
VertexType vexs[Max_Vertex_Num-1];
AdjMatrix arcs[Max_Vertex_Num-1][Max_Vertex_Num-1];
int vexnum,arcnum;
Graphkind kind;
}Mgraph;
Mgraph G[INFINITY];
typedef struct
{
int fromvex,endvex;
int length;
}edge;
AdjMatrix arcs[Max_Vertex_Num-1][Max_Vertex_Num-1];
edge T[Max_Vertex_Num-1];
void CreateDN(Mgraph G[])
{
int i,j,v1,v2,w;
printf("\nPlease input the number of vertexs and edges(formar:vnum,enum):");
scanf_s("%d,%d",&(G->vexnum),&(G->arcnum));
getchar();
for(i=0;ivexnum;i++)
for(j=0;jvexnum;j++)
if(i == j)
G->arcs[i][j] = 0;
else
G->arcs[i][j] = INFINITY;
for (i=0;ivexnum;i++)
{
printf("\nPlease input the information of vertex :");
scanf_s("%c",&(G->vexs[i]));
getchar();
}
for (i=0;iarcnum;i++)
{
printf("\nPlease input the two Vertex and edge between them in former order(format:v1,v2,e1):");
scanf_s("%d,%d,%d",&v1,&v2,&w);
getchar();
G->arcs[v1-1][v2-1] = w;

}
}
int CreateUDN(Mgraph G[])
{
int i,j,v1,v2,w,r;
printf("\nPlease input the number of vertexs and edges(formar:vnum,enum):");
scanf_s("%d,%d",&(G->vexnum),&(G->arcnum));
getchar();
for(i=0;ivexnum;i++)
{
for(j=0;jvexnum;j++)
{
if(i == j)
G->arcs[i][j] = 0;
else
G->arcs[i][j] = INFINITY;
}
}
for (i=0;ivexnum;i++)
{
printf("\nPlease input the information of vertex :");
scanf_s("%c",&(G->vexs[i]));
getchar();
for(j=0;jvexnum;j++)
{
G->arcs[i][j]=INFINITY;
}
}
for (i=0;iarcnum;i++)
{
printf("\nPlease input the two Vertex and edge between them in former order(format:v1,v2,e1):");
scanf_s("%d,%d,%d",&v1,&v2,&w);
getchar();
G->arcs[v1-1][v2-1] = w;
G->arcs[v2-1][v1-1] = w;
}
r=G->arcnum;
return r;
}
void PRIM(Mgraph G[])
{
int j,k,p,d,v,min;
clock_t timeBegin,timeEnd;
edge temp;
for(j=1;j<=G->vexnum-1;j++)
{ T[j-1].fromvex=1;
T[j-1].endvex=j+1;
T[j-1].length=G->arcs[0][j];
}
timeBegin=clock();
#pragma omp parallel
{
#pragma omp for
for(k=0;kvexnum-1;k++)
{
min=10000;
#pragma omp parallel
{
#pragma omp for
for(j=k;jvexnum-1;j++)
if(T[j].length{ min=T[j].length;
p=j;
}
}
temp=T[p];T[p]=T[k];T[k]=temp;v=T[k].endvex; /*交换位置*/
#pragma omp parallel
{
#pragma omp for
for(j=k+1;jvexnum-1;j++)
{d=G->arcs[v-1][T[j].endvex-1];
if(d{ T[j].fromvex=v;

/*更新*/
T[j].length=d;
}
}
}
}
}
timeEnd=clock();
printf("The cost of the time is:%f",(double)(timeEnd-timeBegin));
}
void Error()
{
printf("\ninput Graph type error , please input as follows\n");
printf("\n\tGraph type 0. Directed Graph");
printf("\n\tGraph type 1. Undirected Graph");
}
void Output(Mgraph G[])
{
int i;
printf("\nThe min madetree is:\n");
for(i=0;ivexnum-1;i++)
{
printf("%3d%3d%5d",T[i].fromvex,T[i].endvex,T[i].length);
printf("\n");
}
}
void CreateGraph (Mgraph G[])
{
printf("\nPlease input the type of the Graph(DN=0 or UDN=1):");
scanf_s("%d",&(G->kind));getchar();
switch(G->kind)
{
case 0: CreateDN(G);break;
case 1: CreateUDN(G);break;
default :Error();break;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
CreateUDN( G);
PRIM(G);
Output(G);
getchar();
return 0;
}




相关文档
最新文档