Dijstra与prim

来源:互联网 发布:汉诺伊塔的非递归算法 编辑:程序博客网 时间:2024/06/02 01:53

Dijstra模板:

const int MAXSIZE=100;const int INF=1000000;//除对角线外最初都要初始化为无穷int dist[MAXSIZE];void Dijkstra(int cost[][MAXSIZE],int n,int v)//求v到各个顶点的最短路径{ int i,j,k,min,set[MAXSIZE]; memset(set,0,sizeof(set));初始化 set[v]=1; for(i=0;i<n;i++)  dist[i]=cost[v][i]; for(i=0;i<n;i++) {  min=INF;  k=-1;  for(j=0;j<n;j++)   if(dist[j]<min&&set[j]!=1)/*选取不在set中且具有最小距离的顶点k*/   {    min=dist[j];    k=j;   }  set[k]=1;  for(j=0;j<n;j++)  {  /*修改不在s中的顶点的距离*/   if(cost[k][j]!=INF&&dist[j]>(dist[k]+cost[k][j])&&set[j]!=1)    dist[j]=dist[k]+cost[k][j];  }//dist数组存的就是v到个点的最短路径 }}

prim模板:

const int MAXSIZE=100;const int INF=1000000;//对角线外最初都要初始化为无穷int lowcost[MAXSIZE];void prim(int cost[][MAXSIZE],int n,int v)//从任意点v出发生成最小树{int i,j,k,min,set[MAXSIZE];memset(lowcost,INF,sizeof(lowcost));//初始化为无穷memset(set,0,sizeof(set));set[v]=1;for(i=0;i<n;i++)dist[i]=cost[v][i];for(i=0;i<n;i++){min=INF;k=-1;for(j=0;j<n;j++)if(lowcost[j]<min&&set[j]!=1)/*选取不在lowcost中具有最小距离的顶点k*/{min=dist[j];k=j;}set[k]=1;for(j=0;j<n;j++){  if(lowcost[j]>cost[k][j]&&set[j]!=1)lowcost[j]=cost[k][j];}//lowcost数组存的就是v到各个点的最短路径权值}}
0 0
原创粉丝点击