邮递员投递问题

XiaoG602 2008-10-07 01:41:02

/*
题目描述:
有一个邮递员要在n个城市之间来回送信。但有的城市之间有大路相连
而有的没有路。现在要由一个城市到另一个城市送信,中途最少要经过
多少个其它的城市呢?

输入:
第一行是n,k(1<=n<=10000, 1<=k<=20000),接下来就是k行。
这k行每行有两个数a,b(1 <= a,b <= n),表示城市a和b之间有大路
k行以后就是两个数p和q。
当n,k输入都为0的时候结束。

输出:
输出从城市p到城市q之间最少要经过的其它的城市的数目。
如果p和q之间不连通则输出"No solution"

样例输入:
6 6
1 4
1 2
2 3
3 4
5 4
5 6
1 6
0 0

样例输出:
2
*/


#include <iostream>
using namespace std;

#define MAX 10

/*结点代表城市.stage为城市标号,num为与该城市相连的
其它城市个数,link数组为与该城市相连的城市的标号*/
struct Node
{
int stage;
int num;
int mark;
int link[MAX];
Node()
{
stage=0;
num=0;
mark=0;
int link[MAX]={0};
}
};

Node node[MAX+1];

int findway(Node sta,Node des);

int main()
{
/*建立结点之间的关系*/
int k;
cin>>k;
int a,b,p1=0,p2=0;
for(int i=0;i!=k;i++)
{
cin>>a>>b;
for(int j=0;j<=node[0].num;j++)
{
if(a==node[j].stage)
{
p1=j;
continue;
}
if(b==node[j].stage)
{
p2=j;
continue;
}
}
if(p1==0)
{
p1=++node[0].num;
node[p1].stage=a;
}
if(p2==0)
{
p2=++node[0].num;
node[p2].stage=b;
}
node[p1].link[node[p1].num++]=b;
node[p2].link[node[p2].num++]=a;
p1=p2=0;
}
/*输出检测结点是否建立正确*/
for(i=1;i<=node[0].num;i++)
{
cout<<node[i].stage<<endl;
for(int j=0;j!=node[i].num;j++)
{
cout<<node[i].link[j]<<' ';
}
cout<<endl;
}
int start,dest,length;
cout<<"Please enter the start and the destinition"<<endl;
cin>>start>>dest;
for(i=0;i!=k;i++)
{
for(int j=0;j<=node[0].num;j++)
{
if(start==node[j].stage)
{
p1=j;
continue;
}
if(dest==node[j].stage)
{
p2=j;
continue;
}
}
}
length=findway(node[p1],node[p2]);
cout<<length<<endl;
return 0;
}
/*当目的地des出现在sta的link数组中时返回1,如果没有,则
从sta的link数组的第一个开始遍历,深度搜索,直至搜索到des*/
int findway(Node sta,Node des)
{
for(int i=0;i!=sta.num;i++)
{
if(des.stage==sta.link[i])
return 1;
}
//Node tran;
int tmp,p1;
for(i=0;i!=sta.num;i++)
{
tmp=sta.link[i];
for(int j=0;j<=node[0].num;j++)
{
if(!node[i].mark)
{
if(tmp==node[j].stage)
{
p1=j;
node[j].mark=1;
break;
}
}
}
return 1+findway(node[p1],des);

}
}











...全文
326 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
feibuluo 2012-06-26
  • 打赏
  • 举报
回复
邮递员问题不是这么描述的。邮递员是最短路不重复地把所有节点走一遍。主题无关
XiaoG602 2008-10-07
  • 打赏
  • 举报
回复
我感觉,是不是因为结点没有标记,递归死循环了?
ytmfudukomh 2008-10-07
  • 打赏
  • 举报
回复
Mark
XiaoG602 2008-10-07
  • 打赏
  • 举报
回复
我是想提问的……中午上课紧,忘了写问题了……汗
当我一次输入5,3
1 2
2 3
3 4
的时候,检测1 3之间的通路成功,但是检测1 4之间的通路就趴了……
想知道为什么?
jia_xiaoxin 2008-10-07
  • 打赏
  • 举报
回复
值得一看
无聊司马 2008-10-07
  • 打赏
  • 举报
回复
想向你学习 我看不懂了
liubuweiright 2008-10-07
  • 打赏
  • 举报
回复
学习了,楼主,向你看齐
OenAuth.Core 2008-10-07
  • 打赏
  • 举报
回复
LZ好才情,都代码实现了,呵呵。我还停留在理论阶段,认真研读一下,呵呵。
双子东宝 2008-10-07
  • 打赏
  • 举报
回复
过来学习

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧