DISJKSTRA是求最短路经的经典算法,这是求源点到其它所有顶点的距离,所有的边必须为正 。算法原理:集合Q(除源点),初始状态有所有的顶点。集合S,初始状态只有源点,初始状态将所有的点push入去最小优先(权优先)队列,循环取出点放进S(直到所有的点都放进S),然后每次对取出的点进行relaxation (松驰操作)。
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> pii;
int INF=100000000 ;
int a[100][100];
bool done[100];
int main()
{
priority_queue<pii,vector<pii>,greater<pii> > dijk;
int n,i,j,from,to,vertex,edge,x;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)
a[i][j]=0;
else
a[i][j]=INF;
}
memset(done,true,sizeof(INF));
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
scanf("%d",&from);
scanf("%d",&to);
scanf("%d",&a[from][to]);
}
for(i=1;i<n;i++)
{
dijk.push(make_pair(a[0][i],i));
}
while(!dijk.empty())
{
pii u=dijk.top();
dijk.pop();
x=u.second;
if(done[x]!=true)
continue;
done[x]=false;
for(i=0;i<n;i++)
{
if(a[0][x]+a[x][i]<a[0][i])
{
a[0][x]=a[0][x]+a[x][i];
dijk.push(make_pair(a[0][x],x));
}//relaxation
}
}
}
return 0;
}
或者按照《算法导法》的RELAXATION的操作:(CODE如下:)
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> pii;
int INF=100000000 ;
int a[100][100];
bool done[100];
int d[100];
int father[100];
int main()
{
priority_queue<pii,vector<pii>,greater<pii> > dijk;
int n,i,j,from,to,vertex,edge,x,temp,nn;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
if(i==j)
a[i][j]=0;
else
a[i][j]=INF;
}
memset(done,true,sizeof(INF));
scanf("%d",&nn);
//for(i=0;i<n;i++)
for(j=0;j<nn;j++)
{
scanf("%d",&from);
scanf("%d",&to);
scanf("%d",&a[from][to]);
}
for(i=0;i<n;i++)
{
father[i]=-1;
}
for(i=0;i<n;i++)
{
if(i==0)
d[i]=0;
else
d[i]=INF;
}
for(i=0;i<n;i++)
{
dijk.push(make_pair(d[i],i));
}
while(!dijk.empty())
{
pii u=dijk.top();
dijk.pop();
x=u.second;
if(done[x]!=true)
continue;
done[x]=false;
for(i=0;i<n;i++)
{
if(d[x]+a[x][i]<d[i])
{
d[i]=d[x]+a[x][i];
father[i]=x;
dijk.push(make_pair(d[i],x));
}//relaxation
}
}
temp=n;
for(i=n;i>=0;i--)
{
cout<<"father:"<<father[temp]<<endl;;
temp=father[temp];
}//跟综最短路径
for(i=0;i<n;i++)
{
cout<<"d["<<i<<"]"<<d[i]<<" ";
}
}
return 0;
}