首页 > 其他 > 详细

到源点的最短路径,如果哪里有错误希望大家提出来

时间:2015-12-15 12:10:21      阅读:222      评论:0      收藏:0      [点我收藏+]

#include<iostream>
#include<limits.h>
using namespace std;
int Edge[5][5]={
        0,10,INT_MAX,30,100,
        INT_MAX,0,50,INT_MAX,
        INT_MAX,INT_MAX,0,INT_MAX,10,
        INT_MAX,INT_MAX,20,0,6,60,
        INT_MAX,INT_MAX,INT_MAX,INT_MAX,0
    };//邻接矩阵
int dis[5],flags[5]={1};//V0点进入集合S
void Init_dis(int num);//dis的初始化
int Search_num(int num);//找出不在S集合中到V0的最小值点
int Judge(int num);//判断S是否等于V
int min(int a,int b);//返回较小值
int main()
{
    Init_dis(5);
    while(Judge(5))
    {
        int x=Search_num(5);
        flags[x]=1;//加入到S集合中
        for(int i=0;i<5;i++)
        {
            if(!flags[i]&&Edge[x][i]!=INT_MAX)//判断x->i的是否可达,并且i不在s集合中
            dis[i]=min(dis[i],Edge[x][i]+dis[x]);    
        }
    }
    for(int i=0;i<5;i++)
    cout<<dis[i]<<endl;
    return 0;
}
void Init_dis(int num)//dis的初始化
{
    for(int i=0;i<num;i++)
    dis[i]=Edge[0][i];//源点到每个顶点的距离
}
int Search_num(int num)//找出不在S集合中到V0的最小值点//
{
    int x=0,Min;
    for(int i=0;i<num;i++)
    if(!flags[i])
    {
        Min=dis[i];
        x=i;
        break;
    }
    for(int i=0;i<num;i++)
    {
        if(!flags[i]&&dis[i]<Min)
        {
            x=i;
            Min=dis[i];
        }
    }
    return x;
}
int Judge(int num)//判断S是否等于V
{
    for(int i=0;i<num;i++)
    if(!flags[i])return 1;
    return 0;
}
int min(int a,int b)
{
    return a<b?a:b;
}

S←{ v0 };
dist[j] ←Edge[0][j], j = 1, 2, …, n-1;
②找出最短路径所对应的点K:
dist[k] == min { dist[i] }, i Î V- S ;
S←S U { k };
③对于每一个i Î V- S 修改:
dist[i] ←min{ dist[i], dist[k] + Edge[k][i] }
④判断:若S = V,则算法结束,否则转②。

到源点的最短路径,如果哪里有错误希望大家提出来

原文:http://www.cnblogs.com/zhaoweixiong/p/5047606.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!