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到各个点的最短路径权值
}
}