您的位置:首页 > 其它

dijkstra与prim的初感

2014-03-08 10:41 197 查看
最近接触prim与dijkstra,一直感觉他们俩很像,敲了几个模板题,比较了一下这两种算法。

相同点:记录到当前点最短距离的点i,并标记访问i;

形式主要就以下的区别:

一:当然最主要的是他们解决的问题不同;

二:prim是两个点之间的更新,而dijkstra是成段成段的更新;

三:prim更新时要判断是否访问过(不能形成环),而dijkstra不要(更新到最短);

以下是两个的基本代码:

void dijkstra(int from,int to,int n)
{
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++)
dis[i]=map[from][i];
dis[from]=0;
vis[from]=1;
for(int i=0;i<n;i++){
int x=-1,m=INF;
for(int y=0;y<n;y++){
if(!vis[y]&&dis[y]<m){
m=dis[x=y];
}
}
vis[x]=1;
for(int y=0;y<n;y++){
dis[y]=min(dis[y],dis[x]+map[x][y]);
}
}
}
int prim(int n)
{
int i,j,sum=0,flag,min;
memset(v,0,sizeof(v));
memset(low,0,sizeof(low));
v[1]=1;
for(i=2;i<=m;i++)low[i]=map[1][i];
for(int i=2;i<=m;i++){
min=max;
flag=-1;
for(j=1;j<=m;j++){
if(!v[j]&&low[j]<min){
min=low[flag=j];
}
}
if(min==max)return -1;
v[flag]=1;
sum+=min;
for(j=1;j<=m;j++){
if(!v[j]&&low[j]>map[flag][j]){
low[j]=map[flag][j];
}
}
}
return  sum;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  prim dijkstra