同学 我看到你在http://zhidao.baidu.com/question/15387413.html的回答
作者&投稿:台法 (若有异议请与网页底部的电邮联系)
什么意思???
这里不是说除了PC(电脑)不能连外,其它都上网和人连机玩
我记不太清楚了。好像我关闭了照相机和扫描仪服务就不出现了。你试试。不行的话就不好意思了
/*求两点之间所有路径计算量本来就挺大的,原来用C语言
写的程序是考虑点数不太多的情况下,直接申请了最多可能需要的内存,因此对内存的使用不是和高效的。
在点数比较多的时候(比如你现在有30个点) ,内存就不够用了,因此也计算不出结果了。
改进的方法是根据需要动态的申请内存空间,而不是申请最多可能需要的内存空间。
用C语言动态的管理内存比较麻烦,因此我这里给你一个C++版本的程序,使用了 STL 中的 list.
这个版本无需修改任何常量参数。
如果还不能满足你的需要,欢迎追问,继续改进。
*/
#include <iostream>
#include<list>
using namespace std;
////////////////////路径类////////////////////
class Path
{
public:
Path()
{
this->length = 0;
}
/*在路径中添加一个节点
参数:
n节点的编号
distance 添加节点 n 后,路径增加的长度
*/
void addNode(int n,int distance)
{
this->nodes.push_back(n);
this->length += distance;
}
/*检查在路径是否已经添加特定的节点
参数:
n要查询的是否已经添加到路径中的节点的编号
返回:
节点 n 已经添加到路径中 :true
否则:false
*/
bool isNodeInPath(int n)
{
for(list<int>::iterator it = this->nodes.begin();it != this->nodes.end();it++)
{
if(*it == n)
return true;
}
return false;
}
// 重载输出运算符 "<<" 用来输出一条路径
friend ostream& operator<<(ostream& os,Path &p)
{
if(p.nodes.size() > 0)
{
list<int>::iterator it = p.nodes.begin();
// 输出路径中的第一个点
os << *it;
it++;
// 输出路径中后续的所有点
for(;it != p.nodes.end(); it++)
os << " -> " << *it;
// 输出路径长度
os << "\t(Length:" << p.length << ")" << endl;
}
return os;
}
private:
// 组成路径的点
list<int> nodes;
// 路径的长度
int length;
};
////////////////////地图类////////////////////
class Map
{
public:
// 设置无穷远的路径长度(无需改动)
static const int INFINTITY_DISTANCE = (1<<30);
// 设置单位路径长度(无需改动)
static const int UNIT_DISTANCE = 1;
public:
/*构造函数
参数 :
nodeAmount图中点的数目
*/
Map(int nodeAmount);
// 析构函数
~Map();
/*添加图中直接连通的两个点
参数:
start起点
end终点
distance两点之间的距离。默认两点之间距离为单位 1.
注意:这里的图是无向图。
如果点 startd 到点 end 有路径,那么点 end 到点 startd 也有路径
*/
void addEdge(int start,int end,int distance=UNIT_DISTANCE);
/*查询图中两个点之间的【所有路径】
参数:
start起点
end终点
返回;
点 start 和点 end 之间的一条路径信息,保存在一个 Path 类中。
所有路径的信息,用一个 Path 的链表保存。
*/
list<Path> query(int start,int end);
private:
list<Path> doQuery(int start,int end,Path path);
private:
// 节点总数
int nodesAmount;
// 地图
int **map;
};
Map::Map(int nodesAmount)
{
this->nodesAmount = nodesAmount;
// 动态申请内存并初始化地图上所有点之间的距离
this->map = new int*[nodesAmount];
for(int i=0;i<nodesAmount;i++)
{
this->map[i] = new int[nodesAmount];
for(int j=0;j<nodesAmount;j++)
{
if(i == j)
this->map[i][j] = 0;
else
this->map[i][j] = INFINTITY_DISTANCE;
}
}
}
Map::~Map()
{
delete[] this->map;
}
void Map::addEdge(int start,int end,int distance)
{
this->map[start][end] = this->map[end][start] = distance;
}
list<Path> Map::query(int start,int end)
{
Path path;
path.addNode(start,0);
return doQuery(start,end,path);
}
list<Path> Map::doQuery(int start,int end,Path subPath)
{
list<Path> paths;
if(start != end)
{
for(int n = 0 ; n < this->nodesAmount ; n++)
{
// 当前枚举的节点和终点之间有边(路径),且当前枚举的节点不在路径中
if(this->map[start][n] != INFINTITY_DISTANCE && !subPath.isNodeInPath(n))
{
if(n == end)
{
Path p = subPath;
p.addNode(n,this->map[n][start]);
paths.push_back(p);
}
else
{
// 递归查询节点 n 到终点 end 的所有路径
Path p = subPath;
p.addNode(n,this->map[start][n]);
list<Path> tempPaths = doQuery(n,end,p);
for(list<Path>::iterator it = tempPaths.begin(); it != tempPaths.end(); it++)
{
paths.push_back(*it);
}
}
}
}
}
return paths;
}
int main(int argc, char *argv[])
{
int nodesAmount;
cout<< "输入图的点数:";
cin >> nodesAmount;
Map map(nodesAmount);
int start,end,edgesAmount;
cout<< "输入图的边数:";
cin >> edgesAmount;
for(int i=0;i<edgesAmount;i++)
{
cout<< "输入图的边(点编号 0~" << nodesAmount-1 << "):";
cin >> start >> end;
map.addEdge(start,end);
}
cout << "输入要查询所有路径的两点(点编号 0~" << nodesAmount-1 << "):";
while(cin>>start>>end)
{
list<Path> paths = map.query(start,end);
cout << "There are " << paths.size() <<" way(s) from " << start << " to " << end << " :" << endl;
for(list<Path>::iterator it = paths.begin(); it != paths.end(); it++)
{
cout<<*it;
}
cout << "输入要查询所有路径的两点(点编号 0~" << nodesAmount-1 << "):";
}
return 0;
}
/*
测试用数据:
1)首先输入点数 n
2)接下来输入路径条数 m,
3)然后来输入 m 对点的编号,每对点 a,b 表示点 a 和 点 b 之间有一条路
点的编号从 0 开始到 n-1.
4)最后输入要查询所有路径的两个点,按ctrl+z结束查询。
输入数据:
6
14
01
02
10
13
20
24
25
31
35
42
45
52
53
54
05
04
运行结果:
输入图的点数:6
输入图的边数:14
输入图的边(点编号 0~5):0 1
输入图的边(点编号 0~5):0 2
输入图的边(点编号 0~5):1 0
输入图的边(点编号 0~5):1 3
输入图的边(点编号 0~5):2 0
输入图的边(点编号 0~5):2 4
输入图的边(点编号 0~5):2 5
输入图的边(点编号 0~5):3 1
输入图的边(点编号 0~5):3 5
输入图的边(点编号 0~5):4 2
输入图的边(点编号 0~5):4 5
输入图的边(点编号 0~5):5 2
输入图的边(点编号 0~5):5 3
输入图的边(点编号 0~5):5 4
输入要查询所有路径的两点(点编号 0~5):
0 5
There are 3 way(s) from 0 to 5 :
0 -> 1 -> 3 -> 5 (Length:3)
0 -> 2 -> 4 -> 5 (Length:3)
0 -> 2 -> 5 (Length:2)
输入要查询所有路径的两点(点编号 0~5):
0 4
There are 4 way(s) from 0 to 4 :
0 -> 1 -> 3 -> 5 -> 2 -> 4 (Length:5)
0 -> 1 -> 3 -> 5 -> 4 (Length:4)
0 -> 2 -> 4 (Length:2)
0 -> 2 -> 5 -> 4 (Length:3)
输入要查询所有路径的两点(点编号 0~5):^Z
请按任意键继续. . .
*/
哥们30的阶乘就已经是一个很大的数值了,超出了int类型的最大值范围。所以。。。
鄞蒲奇米: 把握好尺度,非礼勿视,自尊自爱
宾阳县17345298063: 店铺装修模版如何用PS添加文字http://ww? ?
鄞蒲奇米: 在ps里点 T 这个按钮,然后在你操作的文件里点一下,看到有个光标闪后,在键盘上输入你想要的内容,就可以了,在ps上面那条还可以修改文字的大小和字体!
宾阳县17345298063: 我们学校进入学校wifi需要输入个人ID号,请问我上一些网站,学校的路由器会看到那个网站链接么? - ?
鄞蒲奇米: 你是一个学生,你在学校上网需要输入ID号,当你上网时,路由器会对你的上网情况有记录,你上的每个网站都有记录,公安系统还有一个监控系统,也能查到你的上网记录,建议你严格律己,祝你学习进步.
宾阳县17345298063: 不小心看到女同学的胸 - 我上次不小心看到了我同学的胸部了,她却不知道,可我心里很难受怎么? ?
鄞蒲奇米: 不是故意的,心理有什么好难受的,除非你心里不纯才会胡思乱想.把精力投到别的地方去自然难受感觉迎刃而解.!!
宾阳县17345298063: 同学说我朋友的坏话,该不该告诉朋友呢 - ?
鄞蒲奇米: 不要告诉,这样会使两方都不好办,你可以和你的朋友渐渐远离那个同学.
宾阳县17345298063: 同学之间该不该看别人的日记 - ?
鄞蒲奇米: 别说同学之间,就连老师和家长在没有经得别人的同意也是不能看别人日记.这叫尊重隐私权.
宾阳县17345298063: 我在班级是班长 是老师心目中的好学生 虽然自己跟每个老师关系都很好 但和同学... - ?
鄞蒲奇米: 首先,你是班长,是好学生,所以,起码要有自信.你是个很棒的孩子,所以,不要说自己笨.另外,不喜欢游戏机没有错,要是大家都喜欢同样的东西,那岂不是太无趣了?虽然说没有必要为别人而委曲求全的去玩游戏机,手机,但是,从中可以看出你不太善于与人交际.是不是该学点技巧?投其所好是很重要的.还有就是,友情是靠长期培养来的,所以,不能太着急.凡事欲速而不达.记住了,孩子,你是很棒的,你可以做到!!加油.
宾阳县17345298063: 我是双鱼座我喜欢一个巨蟹座的男生他是我初中同学兼高中同学关系还可 - ?
鄞蒲奇米: 也许他不喜欢你,虽然星座还算相配,你跟我一样,但我喜欢的是双鱼,一个人是不是喜欢你是可以感觉的到的,如果他明确的拒绝了你,或者是委婉的告知你他现在还不想谈,说明他对你没那个意思,还算放弃的好,一开始会难过,然后会不甘心,渐渐学会要忘记,如果这个男孩子像你喜欢他一样喜欢你,那就更好啦,只要坚定的告诉他你喜欢他,他的回答,你自然知道怎么做了,当然放弃还是坚持都是你自己的决定,加油!单方面喜欢一个人是很累很压抑的.
宾阳县17345298063: 同学突然针对我,很烦怎么办 - ?
鄞蒲奇米: 首先你心性不是非常好,希望你能放平胸襟,如果不想闹太大的矛盾的话,可以给你一个简单的方法. 首先当着她的面和他道歉,然后和她说明,以后大家互不干涉,不要在影响对方,也不要在背后说坏话. 不要去攀比什么衣服,成绩啊,其实没什么意义.