Dijkstra算法

给你坐标最大为n,边数为m的无向边,输入m条,为x->y,长度为k

求起点(st)到终点(ed)的最短路径

dij()算法分析:

有三个数组,d[]用于记录最短路径,mp用于存储边,vis[]用于标记(标记过的点为已经计算出最短路径的点)

先重置vis[]

在对起点可以一次到达的位置载入到d[]中

设置d[0]=0(起点到起点自然为0)

标记vis[0]

寻找离起点最近的点(且没有被标记过的),然后标记它(已经求出最短距离)

然后更新其它与这个最近点有关的点

#include<iostream>
#include<cstring>
#include<cstdio>
#define inf 0x1f1f1f1f
using namespace std;
int d[151],mp[151][151];
int ans,visit[151];
int n,m;
int st,ed;

void dij()          ///广度优先搜索思想
{
 int i,j,k,v,minx;
 memset(visit,0,sizeof(visit));///初始化标记数组

 for(i=0;i<=n;i++)             ///初始化原始路径(起始位置可以一次到达的点的距离)
    d[i]=mp[st][i];

 d[st]=0;
 visit[st]=1;                  ///对初始点进行标记

 for(i=0;i<=n;i++)
 {

    minx=inf;
    for(j=0;j<=n;j++) ///用于寻找最近(小)的点且没有标记过的点
       if(minx>d[j]&&!visit[j])
        {
          minx=d[j];
          v=j;
        }
    visit[v]=1;               ///对该点进行标记(已经是最短距离)

    for(k=0;k<=n;k++)         ///更新其他点的最短距离(当前)
     if(!visit[k])
        d[k]=min(d[k],d[v]+mp[v][k]);

 }
 printf("%d\n",d[ed]);
}

int main()
{
 int x,y,k;
 while(scanf("%d%d",&n,&m),n!=0||m!=0)///有n个点,m条边
 {
  for(int i=0;i<=n;i++)       ///初始化距离
    for(int j=0;j<=n;j++)
      mp[i][j]=inf;

  for(int i=0;i<m;i++)        ///输入的点的标号不可以大于n
  {
   scanf("%d%d%d",&x,&y,&k);
   if(mp[x][y]>k)             ///如果有路比原来的路还短,则重置为短路径
    mp[x][y]=mp[y][x]=k;      ///输入已知距离(该算法的路径是双向路径)
  }
  scanf("%d%d",&st,&ed);
  dij();

 }
 return 0;
}


阅读更多
上一篇hdu1257最少拦截系统(贪心,lis)
下一篇一个人的旅行
想对作者说点什么? 我来说一句

dijkstra算法

2010年12月11日 174KB 下载

Dijkstra算法C程序实现

2011年03月10日 2KB 下载

Dijkstra算法的应用

2009年09月13日 136KB 下载

没有更多推荐了,返回首页

关闭
关闭