我们先看看他们的模板:
Dijkstra算法:
#include<iostream>
#include<string.h>
using namespace std;
const int MAX=99999999;
int n,m;
int map[203][203],low[203],visit[203];
void dijkstrs(int start)
{
memset(visit,0,sizeof(visit));
int i,j,pos;
visit[start]=1;
for(i=1;i<=n;i++)
{
low[i]=map[start][i];
}
low[start]=0;
for(i=1;i<n;i++)
{
int min=MAX;
pos=start;//这个地方不一样
for(j=1;j<=n;j++)
{
if(visit[j]==0&&min>low[j])
{
min=low[j];
pos=j;
}
}
visit[pos]=1;
for(j=1;j<=n;j++)
{
if(visit[j]==0&&map[pos][j]<MAX)
{
int ne=low[pos]+map[pos][j];
if(ne<low[j])
low[j]=ne;
}
}
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0)
break;
int i,j;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=MAX;
}
int a,b,c;
for(i=1;i<=m;i++)
{
cin>>a>>b>>c;
if(map[a][b]>c)
{
map[a][b]=c;
map[b][a]=c;
}
}
dijkstrs(1);
cout<<low[n]<<endl;
}
}
最小生成树模板
#include<iostream>
#include<string.h>
#include<stdio.h>
using namespace std;
#define MaxInt 0x3f3f3f3f;
int n;
int map[101][101],low[101],visit[101];
int prim()
{
int i,j,pos,result=0;
memset(visit,0,sizeof(visit));
visit[1]=1;
pos=1;
for(i=1;i<=n;i++)
{
if(i!=pos)
{
low[i]=map[pos][i];
}
}
for(i=1;i<n;i++)
{
int min= MaxInt;
for(j=1;j<=n;j++)
{
if(visit[j]==0&&min>low[j])
{
min=low[j];
pos=j;
}
}
result+=min;
visit[pos]=1;
for(j=1;j<=n;j++)
{
if(visit[j]==0&&low[j]>map[pos][j])
low[j]=map[pos][j];
}
}
return result;
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
int m=n*(n-1)/2,i,j,a,b,c;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
map[i][j]=MaxInt;
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&a,&b,&c);
map[a][b]=c;
map[b][a]=c;
}
int ans=prim();
printf("%d\n",ans);
}
}
,我们仔细观察上面的两个模板,你会发现这两个的代码差不多都一样,主要在一个细节上不一样:
这个细节我已经标出来了;
这个我要引用别人的一个图:
仔细看看他,就明白了这个区别了;
图片引用于:http://www.wutianqi.com/?p=1890