您的位置:首页 > 其它

HDU2544 最短路 + 裸 + dijkstra + 邻接矩阵

2016-04-17 18:23 447 查看
1)

//hdu 2544,裸dijkstra
#include <iostream>
#include <string.h>

using namespace std;
const int maxn=120;
const int INF=999999;
int lukou[maxn][maxn];
int visted[maxn];//区别该点是否进入确定的集合之中
int d[maxn];//目前从起点出发,到第i点的最短距离
int dijkstra(int s,int n){

visted[s]=1;//1进入集合
for(int i=1;i<=n;i++){
d[i]=lukou[s][i];//因为1是起点,所以我们先把这个点放入确定的集合之中,也就得到了目前所知的从起点出发,到其他点的初始距离
//cout<<i<<":"<<d[i]<<endl;
}

for(int k=1;k<=n-1;k++){
int jilu;
int minn=INF;
//从起点出发,找出从起点到其他未加入集合中的点i的最短距离的d[i]
for(int i=1;i<=n;i++){
if(!visted[i]&&minn>d[i]){
minn=d[i];
jilu=i;
}
}
visted[jilu]=1;//将该点放入确定的点集中

//因为新加入点,更新从起点出发经过新加入的点到其他的未加入集合的点的距离
for(int i=1;i<=n;i++){
if(!visted[i]&&d[i]>d[jilu]+lukou[jilu][i]){
d[i]=d[jilu]+lukou[jilu][i];
}
}
//继续外层for循环,知道循环n-1次,代表找到了最短路径(因为极端情况下从第一个点到最后一个点,最短路径最少经过n-1条边,这一点和bellmanford 最外层的v-1次循环是一个到道理(v是点的个数))
}
return d
;
}

int main()
{
int n,m;
while(cin>>n>>m&&n!=0){
int a,b,v;
int s=1;//起点
memset(visted,0,sizeof(visted));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
lukou[i][j]=0;
}
else
lukou[i][j]=INF;
}
}
for(int i=1;i<=m;i++){
cin>>a>>b>>v;
lukou[a][b]=v;
lukou[b][a]=v;
}
cout<<dijkstra(s,n)<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: