标题:对于Dijkstra算法的问题,好像是指针有问题吧 ,,,有指教呀
取消只看楼主
我是少飞侯
Rank: 1
等 级:新手上路
帖 子:6
专家分:4
注 册:2011-12-3
结帖率:100%
 问题点数:0 回复次数:0 
对于Dijkstra算法的问题,好像是指针有问题吧 ,,,有指教呀
虽然是函数比较长,但是我注释写的还是比较清楚的,求指教呀。。。。
最后面贴出来的是可以输入检验的数据,还有最重要的函数是void shortestDij(MGraph G,int v0,edge D[],int n),帮忙自习看看呀。。。。
大学生不容易呀,,,,,,
分不多,求帮忙呀。。。。
#include <stdio.h>
#define MAX_NUM   100
int k=0;//记录有多少条路径,k是从1开始的
typedef struct
{
    int arc[MAX_NUM][MAX_NUM];
}MGraph;

typedef struct
{
    int v;//从v到这个点的最小路径
    int s[MAX_NUM];//依次表示路径
}edge;

void CreateMGraph(MGraph &G,int T[])
{
    printf("想要多少个点?\n");   
    scanf("%d",&T[0]);
    printf("想从哪个点出发?\n");
    scanf("%d",&T[1]);

    int i,j;
    printf("请输入图的有关信息:\n");
    for(i=0;i<T[0];i++)
        for(j=0;j<T[0];j++)
        {
            scanf("%d",&G.arc[i][j]);
        }
}
//查看是否可以结束
int finish(MGraph G,edge D[],int n)//n表示一共有的点数
{
    int i,j,m;
    int p[MAX_NUM]={0};
    for(i=1;i<=k;i++)//从第一条路径开始检查
        for(j=0;D[i].s[j]!=-1;j++)//第i条路径的所有元素查询
            for(m=0;m<n;m++)//一共只有n个元素,只要查看这n个元素是否存在就可以了
            {
                if(m==D[i].s[j])
                {
                    p[m]=1;//如果有元素m,那就记录为1
                }
            }
    int a=1;//表示所有的元素都已经存在了
    for(i=0;i<n;i++)
    {
        if(p[i]==0)
        {
            a=0;//还有元素没有装入
            break;
        }
    }
    return a;
}

//将所有的点分开来,p表示已经装入的,q表示还没有装入的
void fenli(MGraph G,edge D[],int p[],int q[],int n)
{
    int i;
    //分离第k-1条路径
    //分离装入了的点
    for(i=0;D[k-1].s[i]!=-1;i++)
    {
        p[i]=D[k-1].s[i];
    }
    p[i]=-1;//-1表示没有点了
    int j;
    int m;//all the point
    int x=0;// number of the q
    int a=0;//判断元素是否在数组里面
    //分离没有被装入的点
    for(m=0;m<n;m++)
    {
        for(j=0;j<i;j++)//扫描p中的点,看是否已经存在
        {
            if(m==p[j])
                a=1;//表示在已经装入的数组里面
        }
        if(a==0) q[x++]=m;
    }
    q[x]=-1;

}

//查找下一个符合要求的点
int Next(MGraph G,edge D[],int n)
{
    int p[MAX_NUM];//已经装入的点
    int q[MAX_NUM];//还没有装入的点

    fenli(G,D,p,q,n);//将k-1条路径分离
    int m;//记录p中含有多少元素
    for(m=0;p[m]!=-1;m++)
        ;
    int x;//记录q中含有多少元素
    for(x=0;q[x]!=-1;x++)
        ;
    int next;
    int Quanzhi=100;//100看作最大的权值
    int i,j;

    for(i=0;i<m;i++)
        for(j=0;j<x;j++)
        {
            if(G.arc[i][j]<Quanzhi)
            {
                next=j;
                Quanzhi=G.arc[i][j];
            }
        }
    return next;
}

//把找到的点记录
void pop(MGraph G,edge D[],int next)
{
    int i;
    for(i=0;D[k-1].s[i]!=-1;i++)
    {
        D[k].s[i]=D[k-1].s[i];
    }
    D[k].s[i]=next;
   
    D[k].s[i+1]=-1;
    D[k].v=D[k-1].v+G.arc[D[k].s[i-1]][D[k].s[i]];
   
   
}

//查询到点的最短路径,返回路径的代号
int chaxu(edge D[],int a)
{
    int i;
    int j;
    int daihao;
    for(i=1;i<=k;i++)//从第一条边到第k条查询
    {
        for(j=0;D[i].s[j]!=-1;j++)//查看第i条边有多少元素
            ;
        if(D[i].s[j-1]==a)//查看最后的元素是否是要查找的
        {
            daihao=i;
            break;
        }
    }
    return daihao;
}

//查看是否要更改路径,如果是那就更改
void change(MGraph G,edge D[])
{
    int i;
    for(i=0;D[k].s[i]!=-1;i++)
        ;//计算路径的点的个数
    int next;//新加入的点
    next=D[k].s[i-1];//好好考虑
    int min;//到达点j的最优化路径
    int j;
    for(j=0;j<=i-3;j++)
    {
        min=chaxu(D,D[k].s[j]);
        if((D[min].v+G.arc[D[k].s[j]][D[k].s[i-1]])<D[k].v)
        //change the route
        {
            int z;
            for(z=0;D[min].s[z]!=-1;z++)
            {
                D[k].s[z]=D[min].s[z];
            }
            D[k].s[z]=next;
            D[k].s[z+1]=-1;
        }
    }
    printf("(%d)  ",k);
    for(j=0;D[k].s[j]!=-1;j++)
    {
        printf("%d-->",D[k].s[j]);
    }
    printf("END");
}

void shortestDij(MGraph G,int v0,edge D[],int n)
{
    k++;
    int next;
    D[k].v=0;
    D[k].s[0]=D[k].s[1]=v0;//从自己开始
    D[k].s[2]=-1;//-1表示后面没有点了
    while(!finish(G,D,n))
    {
        k++;
        //寻找下一个点,最小权值
        next=Next(G,D,n);//第k条路径还没有初始化
        //初始化第k条路径
        pop(G,D,next);
        //查看第k路径是否合适,是否要更改路径
        change(G,D);
    }
}

void main()
{
    MGraph G;
    int n,v0;
    int T[2];
    CreateMGraph(G,T);
    n=T[0];v0=T[1];
    edge D[MAX_NUM];
    shortestDij(G,v0,D,n);
}
/*
0       100     1       100     3       10
100     0       5       100     100     100
100     100     0       5       100     100
100     100     100     0       100     1
100     100     100     2       0       6
100     100     100     100     100     0
*/
搜索更多相关主题的帖子: 记录 include 大学生 
2011-12-08 15:46



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-357314-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.715315 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved