64,637
社区成员
发帖
与我相关
我的任务
分享
/*
题目描述:
有一个邮递员要在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);
}
}