您的位置:首页 > Web前端 > JavaScript

未优化的dijsktra(参考YSQ)

2016-03-08 19:20 435 查看
#include<iostream>//要求边不存在负权,求单源最短路,即从一个顶点出发,到其余每个点的最短路
#include<cstring>
#include<cmath>
const int mn=1000+10,me=2*mn+10;
int arcs[mn][mn];//邻接矩阵
int dis[mn];//dis[]代表从顶点1到点i的最短路
bool vis[mn];//代表这个点的最短路是否被求出
int m,n;//n代表点数,m代表边数
int cnt=1;//cnt代表s集合中点的个数
using namespace std;
void dijsktra(){
for(int i=1;i<=n;i++)//初始化,将arcs[1][i](也就是与远点直接相连的点更新,其他点为0x3f)
dis[i]=arcs[1][i];
vis[1]=true;//1-1已确定
dis[1]=0;
while(cnt<n){
int minn=1;//dis[i]不一定属于v集合***v集合代表未被确定的点
for(int i=1;i<=n;i++){//dis[]最大的点一定属于v集合**because dis[]最小的点已经被确定,已属于s集合
if(dis[i]>dis[minn])
minn=i;
}
for(int i=1;i<=n;i++){//寻找v集合中dis最小的点,放入s集合
if(dis[i]<dis[minn]&&vis[i]==false)
minn=i;
}
vis[minn]=true;
for(int i=1;i<=n;i++)
dis[i]=min(dis[i],dis[minn]+arcs[i][minn]);
cnt++;
}
}
int main(){
cin>>m>>n;
memset(arcs,0x3f,sizeof(arcs));
memset(dis,0x3f,sizeof(dis));
memset(vis,false,sizeof(vis));
for(int i=1,x,y,z;i<=m;i++){
cin>>x>>y>>z;
arcs[x][y]=min(z,arcs[x][y]);
arcs[y][x]=arcs[x][y];
}
dijsktra();
cout<<dis
<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  图论