您的位置:首页 > 其它

最短路算法(dijkstra)

2016-06-08 17:12 375 查看
#include<iostream>
using namespace std;

int edgs[100][100];     //边
int dist[MAXNUM];        //v0到各边的值
int prev[MAXNUM];       //前驱数组

void Dijkstra(int v0,int n)
{
bool S[MAXNUM];        //确定顶点是否在S集合中

for(int i=0;i<n;i++)
{
dist[i]=edgs[v0][i];    //vo到个点的初值
S[i]=false;         //所有节点未加入S
if(dist[i] ==MAXINT)
{
prev[i]=-1;     //没有前驱节点
}
else
prev[i]=v0;
}

dist[v0] =0;
S[v0]=true;
/*
求v到v0的最短距离,将v加到S集中
*/
for(int i=1;i<n;i++)
{
int min    =MAXINT;
int u=v0;

//找到当前未使用点的DISJ[i]最小值
for(int j=0;j<n;j++)
{
if((!S[j]) && dist[j]<min)
{
u=j;
min=dist[j];
}

S[u]=true;   //找到最短路径  加入顶点

//以新加入的节点    更新从 v0触发到集合V-S的顶点路径长度
for(int j=0;j<n;j++)
if((!S[j]) && dist[u]+edgs[u][j]<dist[j])    //通过新加入节点找到更短路径
{
dist[j]=dist[u]+edgs[u][j];
prev[j]=u;     //更新前驱节点
}
}
}
}
int main()
{
int n;     //图的顶点数
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>edgs[i][j];     //边的权值

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: