急求 图的最短路径问题的程序…数据结构类…具体要求如下…急啊…

1.问题描述图的最短路径问题是指从指定的某一点v开始,求得从该地点到图中其它各地点的最短路径。并且给出求得的最短路径的长度及途径的地点。除了完成最短路径的求解外,还能对该... 1. 问题描述
图的最短路径问题是指从指定的某一点v开始,求得从该地点到图中其它各地点的最短路径。并且给出求得的最短路径的长度及途径的地点。除了完成最短路径的求解外,还能对该图进行修改,如顶点以及边的增删、边上权值的修改等。
校园最短路径问题中的数据元素有:
(1) 顶点数
(2) 边数
(3) 边的长度
设我校的站点有学校大门,学院宾馆校门 ,第一教学楼,第二教学楼,第三教学楼,办公楼,同心楼,文虎楼,逸夫楼,教工食堂,第一组团,第二组团,第三组团,第四组团,体育馆,操场。假设以我校的范围为虚拟的范围,以上的站点为例自行设置相邻两个站点路线长度
2. 功能需求
要求完成以下功能:
(1) 输出顶点信息:将校园内各位置输出。
(2)输出边的信息:将校园内每两个位置(若两个位置之间有直接路径)的距离输出。
(3) 修改:修改两个位置(若两个位置之间有直接路径)的距离,并重新输出每两个位置(若两个位置之间有直接路径)的距离;
(4) 求最短路径:输出给定两点之间的最短路径的长度及途经的地点或输出任意一点与其他各点的最短路径。
(5)删除:删除任意一条边。
(6)插入:插入任意一条边。
3. 实现要点
(1)对图的创建采用邻接矩阵的存储结构,为了便于处理,对于图中的每一个顶点和每一条边均设置了初值。
(2)为了便于访问,用户可以先输出所有的地点及距离。
(3)用户可以随意修改任意两点之间的距离。
(4)用户可以任意增加及删除边。
(5)当用户操作错误时,系统会出现出错提示。
展开
 我来答
250cfeoom
2011-06-25 · TA获得超过2557个赞
知道大有可为答主
回答量:4657
采纳率:71%
帮助的人:1046万
展开全部
一:
#include "stdafx.h"
#include <limits>
#include <iostream>
#include <fstream>
using namespace std;

const int MAXINT = numeric_limits<int>::max();

template <class Type>
void Dijkstra(int n, int v, Type dist[], int prev[], Type** c)
{

bool *s = new bool[n+1];
int i, j;
for(i = 1; i <=n; i++)
{
dist[i] = c[v][i];
if(c[v][i]!=MAXINT)
prev[i] = v;
else prev[i] =0;
s[i] = false;
}
s[v] = true;
dist[v] = 0;
prev[v] = 0;

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

int u = v;
int temp = MAXINT;
for( j = 1; j<=n; j++)
if(!s[j]&&dist[j]<temp)
{
u = j;
temp = dist[j];
}
s[u] = true;
for(j=1; j<=n; j++)
{
if((!s[j])&&c[u][j]<MAXINT)
{
if((dist[u]+c[u][j])<dist[j])
{
dist[j] = dist[u] + c[u][j];
prev[j] = u;
}
}
}

}

delete [] s;

}
void djpath(int m, int v, int prev[])
{
int i = m ,j =1;

while(i!=0)
{
if (j == 1)
{
cout<< i;
j = 0;
}
else
cout<< "-" << i;
i = prev[i];
}

cout<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
cout<<"最大整数:"<<MAXINT<<endl;
int prev[6], dist[6];
int i,j,n;
int** myc;

FILE *fp;
fp=fopen("data.txt", "r");
fscanf(fp,"%d", &n);

myc = new int* [n+1];
for(i =0; i<=n; i++)
myc[i] = new int[n+1];

for(i=1; i<=n; i++)
for(j =1; j<=n; j++)
{
fscanf(fp, "%d",&myc[i][j]);
if (myc[i][j]==-1)
myc[i][j] = MAXINT;
}

Dijkstra(5, 1, dist, prev, myc);

for(i = 1; i<=5; i++)
cout<<dist[i]<<endl;

for(i=2; i<=5; i++)
djpath(i,1,prev);

for(i = 0; i<=5; i++)
delete[] myc[i];
delete [] myc;

return 0;
}

输入数据采用文本文件格式,下面是data.txt的内容:
5
0 10 -1 30 100
10 0 50 -1 -1
-1 50 0 20 10
30 -1 20 0 60
100 -1 10 60 0

本文来自CSDN博客,转载请标明出处:

二:
#include<iostream>
using namespace std;

void main()
{
int infinity=100,j,i,n,k,t,**w,*s,*p,*d;
cout<<"input the value of n:";
cin>>n;
cout<<endl;

d=new int[n];
s=new int[n];
p=new int[n];
w=new int*[n];
for(i=0;i<n;i++)
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>w[i][j];

for(s[0]=1,i=1;i<n;i++)
{
s[i]=0;d[i]=w[0][i];
if(d[i]<infinity) p[i]=0;
else p[i]=-1;
}

for(i=1;i<n;i++)
{
t=infinity;k=1;
for(j=1;j<n;j++)
if((!s[j])&&(d[j]<t)) //在蓝点集中选择一个最短距离最小的蓝点k来扩充红点集是Dijkstra算法的关键
s[k]=1;//point k join the S
for (j=1;j<n;j++) //将k扩充到红点后,剩余蓝点集的估计距离可能由于增加了新红点k而减小,此时必须调整相应蓝点的估计距离。对于任意的蓝点j,若k由蓝变红后使D[j]变小,则必定是由于存在一条从s到j且包含新红点k的更短路径:P=<s,…,k,j>。且D[j]减小的新路径P只可能是由于路径<s,…,k>和边<k,j>组成。所以,当length(P)=D[k]+w<k,j>小于D[j]时,应该用P的长度来修改D[j]的值。
if((!s[j])&&(d[j]>d[k]+w[k][j]))

}
cout<<"从源点到其它顶点的最短距离依次如下:";
for(i=1;i<n;i++) cout<<d[i]<<" ";
}

以上二个代码都是完整可以使用的,楼主喜欢哪个就用那个吧。自己还是可以仔细分析下代码。
吴成鹏
2011-06-24 · TA获得超过8514个赞
知道大有可为答主
回答量:1726
采纳率:0%
帮助的人:1277万
展开全部
看的眼睛都花了,静等大能
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友472ace5
2011-06-24 · TA获得超过2587个赞
知道小有建树答主
回答量:1021
采纳率:50%
帮助的人:733万
展开全部
太专业,祝你好运。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2011-06-24
展开全部
老大这图纸也至少要几千块
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 2条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式