一道c语言的题目编号为1..N的N座城镇用若干仅供单向行驶的道路相连,每条道路上均有两个参数:道路长度(length)和在该条道路上行驶的费用(cost).BOB准备从城镇1出发到达城镇N,但他目前只

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/11 00:52:03
一道c语言的题目编号为1..N的N座城镇用若干仅供单向行驶的道路相连,每条道路上均有两个参数:道路长度(length)和在该条道路上行驶的费用(cost).BOB准备从城镇1出发到达城镇N,但他目前只

一道c语言的题目编号为1..N的N座城镇用若干仅供单向行驶的道路相连,每条道路上均有两个参数:道路长度(length)和在该条道路上行驶的费用(cost).BOB准备从城镇1出发到达城镇N,但他目前只
一道c语言的题目
编号为1..N的N座城镇用若干仅供单向行驶的道路相连,每条道路上均有两个参数:道路长度(length)和在该条道路上行驶的费用(cost).BOB准备从城镇1出发到达城镇N,但他目前只有W的钱,为此,你需要帮助他寻找一条从城镇1到城镇N在他能支付的前提下的一条最短路线.
输入:
N K W(N为城镇数目,2

一道c语言的题目编号为1..N的N座城镇用若干仅供单向行驶的道路相连,每条道路上均有两个参数:道路长度(length)和在该条道路上行驶的费用(cost).BOB准备从城镇1出发到达城镇N,但他目前只
#include <iostream>
using namespace std;

//记录两点间的路径
class lu
{
public:
//A点及B点
int pointA;
int pointB;
//路径长度
int lenth;
};

//点的集合
class inn
{
private:
public:
//用节点数初始化,本程序未用到
inn(int);
//直接初始化,以后要用ml(int);分配内存
inn();
//析构函数释放内存
~inn();
//根据节点个数分配内存
void ml(int);
//数据
int *data;
//有效元素个数
int len;
//新增元素
void add(int);
//删除元素
void cut(int);
};
//初始化(len均设为0,表示无数据)//
inn::inn(int n)        //
{//
data = new int[n];//
len = 0;//
}//
//
inn::inn()//
{//
len = 0;//
}//
//
inn::~inn()//
{//
delete[]data;//
}//
//
void inn::ml(int n)//
{//
data = new int[n];//
}//
//////////////////////////////


void inn::add(int d)
{
data[len++] = d;
}


void inn::cut(int d)
{
for (int i = 0; i<len - 1; ++i)
{
if (data[i] == d)
{
for (int j = i; j<len - 1; ++j)
{
data[j] = data[j + 1];
}
}
}
--len;
}

class Graph
{
private:
//节点个数
int n;
//无像图数据
int **G;
//源点
int s;
//没计算的点的集合
inn V;
//已计算的点的集合
inn S;
//路径
inn p;
//存储路径
string *pa;
public:
//用节点个数分配内存
Graph(int);
//析构函数释放内存
~Graph();
//设置源点
void SetSource(int);
//输入无像图邻接矩阵
void input();
//贪心算法求最短路径
void ALG();
//输出最短路径
void output();
};

Graph::Graph(int n)
{
this->n = n;
G = new int*[n];
for (int i = 0; i < n; i++)
{
G[i] = new int[n];
}
V.ml(n);
S.ml(n);
p.ml(n);
pa = new string[n];
}

Graph::~Graph()
{
for (int i = 0; i <n; i++)
{
delete[]G[i];
}
delete[]G;
delete[]pa;
}

void Graph::SetSource(int s)
{
this->s = s;
S.data[0] = s;
S.len = 1;
p.data[s] = 0;
p.len = 1;
int j(0);
for (int i = 0; i<n; ++i)
{
//源点除外
if (i != s)V.data[j++] = i;
}
V.len = n - 1;
}

void Graph::input()
{
for (int i = 0; i<n; ++i)
for (int j = 0; j<n; ++j)cin >> G[i][j];
}

void Graph::ALG()
{
while (S.len != n)
{
//定义临时变量
lu min;
//初始化临时变量,假设最短距离是已计算的第一个点和未计算的第一个点
min.pointA = S.data[0];
min.pointB = V.data[0];
min.lenth = G[S.data[0]][V.data[0]];
//找到未计算的距离已计算点的集合最近的点
for (int i = 0; i<S.len; ++i)
{
for (int j = 0; j<V.len; ++j)
{
//如果找到更短的
if (G[S.data[i]][V.data[j]]<min.lenth)
{
//记录有哪个点出发
min.pointA = S.data[i];
//记录到达哪个点
min.pointB = V.data[j];
//记录距离
min.lenth = G[S.data[i]][V.data[j]];
}
}
}
//新增的点的最短距离重新定义,或许还有更短的
//p.data[min.pointA] + min.lenth表示目前这条路径的长度
int min_ = p.data[min.pointA] + min.lenth;
char temp[10];
_itoa_s(min.pointB, temp,10, 10);
pa[min.pointB] = pa[min.pointA] + "->" + temp;
//在已计算的点中寻找是否有更短的路径
for (int i = 0; i < S.len; ++i)
{
//找到,替换当前路径长度
//若是无向图则也可以写成G[min.pointB][S.data[i]]
if (G[S.data[i]][min.pointB] + p.data[S.data[i]] < min_)
{
min_ = G[S.data[i]][min.pointB] + p.data[S.data[i]];
pa[min.pointB] = pa[i] + "->" + temp;
}
}
//记录路径长度
p.data[min.pointB] = min_;
//将新找到的点从未计算移到已计算,重复当前步骤,直到所有点都已计算
S.add(min.pointB);
V.cut(min.pointB);
}
}

void Graph::output()
{
for (int i = 0; i<n; ++i)
cout <<s<<"到"<<i<<":\n"<<s<<pa[i].c_str()<<"\n路径长度:"<< p.data[i] << endl;
}

int main()
{
int n;
cout << "节点数:" << flush;
cin >> n;
Graph G(n);
cout << "矩阵:" << endl;
G.input();
int s;
cout << "源点:" << flush;
cin >> s;
G.SetSource(s);
G.ALG();
G.output();
getchar();
getchar();
}




这是我以前写的一个贪心算法求单源最短路径的源代码,你那程序也可用这个算法,自己慢慢琢磨吧


输入是以二维数组形式保存的邻接表,希望对你有帮助,多读些代码有好处哦,你这个程序懒得写,耗时间,你自己写写试吧,到网上找些类似的看看,学编程一定要自己动手才会有进步哦

一道c语言的题目编号为1..N的N座城镇用若干仅供单向行驶的道路相连,每条道路上均有两个参数:道路长度(length)和在该条道路上行驶的费用(cost).BOB准备从城镇1出发到达城镇N,但他目前只 一道C语言的题目(1) 对数组A中的N(0<N<100)个整数从小到大进行连续编号,要求不能改变数组A中元素的顺序,且相同的整数要具有相同的编号.例如: A=(5,3,4,7,3,5,6) 则输出为: (3,1,2,5,1,3,4 关于C语言的一道题:n的值为2,n+=n-=n*n 最后n的值是多少? 程序设计题!请用C语言回答哈哈n个元素{1,2,...,n }有n!个不同的排列.将这n!个排列按字典序排列,并编号为0,1,…,-1.每个排列的编号为其字典序值.例如,当n=3时,6 个不同排列的字典序值如下:0 1 2 一道C语言题,求答案(用C语言做)有N个灯放在一排,从1到N依次顺序编号.有N个人也从1到N依次顺序编号.1号将灯全部关闭,然后2将凡是2的倍数的灯打开;3号将凡是3的倍数的灯做相反处理(该 c语言作业,编写程序:计算m!/(m-n)!,其中m、n为正整数且m>n老师布置的c语言题目,数学也不太好,求代码, 救命,关于概率论的一道题目将N个小球(编号1-N)放入N个箱子(编号1-N),一个箱子装1个球.若小球和箱子编号相同,称为一个配对,记X为配对数,求X的数学期望E(X).我想不通啊 C语言:求子序列的和C语言的一道题目,请高手指导下,问题是n和m可以大到10的6次. 求支援 关于C语言的题目:下列字符串为合法的字符常量的是:A、n B、‘ ’ C、110 D、“n” 问一道简单的C语言题目输入正整数n,按从小到大的顺序输出所有形如 abcde/fghij=n的表达式,其中a~j恰好为数字0~9的一个排列,2 设编号从1,2,...,n的n个人围坐一圈,约定编号为k(1 请问怎么输出下面的图形,要用C语言设计一程序 n n n n n n n n n n n n n n n n C语言**** 的意思 C语言开关灯问题,麻烦大神们帮我看看这个程序哪里错了啊,结果不对啊!假设有N盏灯(N为不大于5000的正整数),从1到N按顺序依次编号,有M个人(M为不大于N的正整数)也从1到M依次编号,第一个人(1 一道题求期望值有编号为1、2、3.n的n个盒子,有编号1、2、3...n的n张纸条.将纸条放入盒子,每个盒子放一张.求,放在盒子里的纸条的编号,和纸条所放在的盒子的编号,这两个编号对号的期望 求注一道 C 语言题目 我想问 一些 细节 求大神解答用递归法求: (x/1!)+(x*x*x/3!)+(5个x相乘/5!)+……+((2n-1)个X相乘/(2*n-1)!) 当N为某值时上式为多少?(到第n项,n和x的值由键盘输入.)我这样编的#in 一道C语言的题目,递归法7、用递归法求:(x/1!)+(x*x*x/3!)+(5个x相乘/5!)+……+((2n-1)个X相乘/(2*n-1)!) 当N为某值时上式为多少?(到第n项,n和x的值由键盘输入.) 一道C语言的题目求代码