对于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
*/