单源最短路径(Dijkstra算法)

//Dijkstra代码解释版本
#include<iostream>
using namespace std;


const int maxn=1000+10;
const int INF=0x3fffffff; //因为dijkstra会有2个最大值相加的情况,所以用0x7fffffff会溢出


int map[maxn][maxn];
int dis[maxn]; //dis[i]表示当前源点到i的最短距离


bool used[maxn];


void init()
{
for(int i=0;i<maxn;i++)
{
for(int j=0;j<maxn;j++)
{
map[i][j]=INF; //初始化图没有边,全部距离为无穷大INF
}
dis[i]=INF;
}
memset(used,0,sizeof(used));
}


int dijkstra(int start,int end,int n) //起点,终点,总点数编号为[1,n]
{

int minNode;
dis[start]=0; //初始化起点

for(int i=1;i<=n;i++) //n-1次循环确定n-1个点的dis[i]为最短路
{
int min=INF;
for(int j=1;j<=n;j++) //找出未标记过的离源点最近的点
{
if(!used[j] && dis[j]<min)
{
min=dis[j];
minNode=j; //minNode为当前到起点距离最短的点
}
}

used[minNode]=1; //标记是灰常重要的~~

for(int k=1;k<=n;k++) //松弛操作:以minNode为中间点,如果start->minNode->k的距离小于start->k,则start->k赋值为start->minNode->k
{
if(!used[k] && dis[minNode]+map[minNode][k]<dis[k])
{
dis[k]=dis[minNode]+map[minNode][k];
}
}
}


if(dis[end] != INF)
return dis[end] ;
else
return -1 ;

}


int main()
{
int n,m;
int a,b,c;
while(cin>>n>>m,n+m)
{
init();
while(m--)
{
cin>>a>>b>>c;
if(c<map[a][b]) //判重边
{
//map[a][b]=map[b][a]=c; //无向边
map[a][b]=c; //有向边
}
}

int start,end;
cin>>start>>end;
cout<<  dijkstra(start,end,n)  <<endl;


}
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值