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]);
}
}
}
相同点:记录到当前点最短距离的点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; }
相关文章推荐
- Dijkstra和floyd——求单源点最短路径
- 最小生成树
- HDU 2544
- 最小生成树之prim算法
- UVa Problem 10039 Railroads (铁路)
- Dijkstra最短路径算法
- 全局最短路径搜索算法 Dijkstra
- hdu1874(dijkstra)
- POJ1287-Networking
- Sicily 1090. Highways
- hdu 1789 继续畅通工程
- hdu 4463 Outlets(prim)
- hdu 3790 最短路径问题 (dijkstra算法+memset()用法)
- hdu 1874 畅通工程续 (dijkstra算法)
- poj 2253 Frogger(dijkstra)
- c#实现Prim算法
- Dijkstra算法C#实现
- 畅通工程续
- 一个人的旅行
- Zipper