您的位置:首页 > 其它

校园导游咨询

2008-12-25 04:48 281 查看
#include <stdio.h>
#include <stdlib.h>
#define MAXV 20
#define INF 32767
typedef struct
{

int edges[MAXV][MAXV];
int n;
} MGraph;
/*狄克斯特拉算法*/
void Ppath(int path[],int i,int v)
{
int k;
k=path[i];
if(k==v) return;
Ppath(path,k,v);
printf("%d,",k);
}
void PRINTF(int dist[],int path[],int s[],int n,int v,int x)
{
int i;

if(s[x]==1)
{

printf("从%d到%d的最短路径长度为:%d/t路径为:",v,x,dist[x]);
printf("%d,",v);
Ppath(path,x,v);
printf("%d/n",x);

}
else printf("从%d到%d不存在路径/n",v,x);

}
void Dijkstra(MGraph p,int v,int d)
{
int dist[MAXV],path[MAXV];/*dist每个分量Dist[i] 表示当前所找到的从开始点v0到每个终点vi的最短路径的长度*/
/**/
int s[MAXV];
int mindis,i,j,u;
for(i=0;i<p.n;i++)
{
dist[i]=p.edges[v][i];
s[i]=0;
if(p.edges[v][i]<INF) path[i]=v;
else path[i]=-1;
}
s[v]=1;path[v]=0;
for(i=0;i<p.n;i++)
{
mindis=INF;
for(j=0;j<p.n;j++)
{
if(s[j]==0&&dist[j]<mindis)
{
u=j;
mindis=dist[j];
}
}
s[u]=1;
for(j=0;j<p.n;j++)
{
if(s[j]==0)
{
if(p.edges[u][j]<INF&&dist[u]+p.edges[u][j]<dist[j])
{
dist[j]=dist[u]+p.edges[u][j];
path[j]=u;
}
}
}
}
PRINTF(dist,path,s,p.n,v,d);

}

int main()
{
int i,j,n,x,d;
MGraph p;
char a[100];
printf("请输入带权无向图的顶点个数:");
scanf("%d",&n);
printf("请输入各顶点所代表的景点名称:/n");
for(i=0;i<n;i++)
{
printf("%d:",i);
getchar(a);
getchar(a);
printf("/n");
}
while(n!=0)
{
printf("请输入带权无向图的邻接矩阵:/n");
/*0 5 8 7 32767 3
5 0 4 32767 32767 32767
8 4 0 5 32767 9
7 32767 5 0 5 6
32767 32767 32767 5 0 1
3 32767 9 6 1 0*/
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&p.edges[i][j]);
}
}
p.n=n;
printf("***本程序采用狄克斯特拉算法生成每个顶点到其他顶点的最短路径***/n");
printf("请输入您要查找的起点(0--%d):/n以数%d标记结束/n",n-1,n);
scanf("%d",&x);
while(x!=n)
{
printf("请输入您要查找的终点(除了起点%d):/n",x);
scanf("%d",&d);
Dijkstra(p,x,d);printf("/n");
printf("请输入您要查找的起点(0--%d):/n以数%d标记结束/n",n-1,n);
scanf("%d",&x);
}
printf("查找结束!/n");
printf("请输入带权无向图的顶点个数,若退出程序请直接输入0:/n");
scanf("%d",&n);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: