神秘国度的爱情故事 (精选范文)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
软件综合课程设计
神秘国度的爱情故事
活期储蓄帐目管理
二〇一四年六月
神秘国度的爱情故事
1.问题陈述
输入要求:
输入由若干组测试数据组成。
每组数据的第1行包含一正整数n(1≤n≤50000),代表神秘国度中小村的个数,每个小村即从0到n-1编号。接下来有n-1行输入,每行包含一条双向道路的两端小村的编号,中间用空格分开。之后一行包含一正整数m(1≤m≤
500000),代表着该组测试问题的个数。接下来m行,每行给出a,b,c 三个小村的编号,中间用空格分开。
当n为0时,表示全部测试结束,不要对该数据做任何处理。
输出要求:
对每一组测试给定的a,b,c,在一行里输出答案,即:如果c在a和b 之间的路径上,输出yes,否则输出no。
2.程序代码
//神秘国度的爱情故事代码
#include<iostream>
using namespace std;
#define maxnode 100 //图中顶点的最大个数
typedef char elemtype; //顶点的数据类型
struct node //定义边的表结点
{ int adjvex; //邻接点在顶点向量中的下标 struct node *next; //指向下一邻接点的指针
};
typedef struct //定义顶点结点
{ elemtype vertex; //顶点信息
node *firstarc; //指向第一邻接点的指针 }vernode;
typedef struct
{ vernode vertices[maxnode];//定义邻接表
int vexnum,arcnum; //顶点和边的数目
}algraph;
algraph creatgraph(algraph g){//建立图函数
int i,j,k; //i,j,k用于边和顶点的建立 node *p; //用于新生成顶点的指针
cout<<输入小村的个数:<<endl;
cin>>g.vexnum;
g.arcnum=g.vexnum-1;
for(i=0;i<g.vexnum;i++)
{
g.vertices[i].firstarc=null;
}
cout<<输入道路两端小村的编号(<<g.vexnum-1<<次,中间用空格分开):<<endl;
for(k=0;k<g.arcnum;k++)
{
cin>>i>>j;
p=(node*)malloc(sizeof(node));
p->adjvex=j;
p->next=g.vertices[i].firstarc;
g.vertices[i].firstarc=p;//用头插法 p=(node*)malloc(sizeof(node));
p->adjvex=i;
p->next=g.vertices[j].firstarc;
g.vertices[j].firstarc=p;
}
return g;
}
int visited[maxnode]; //用于深度遍历记住遍历过的顶点
algraph g; //全局图
int w; //记住c【j】点
int count=0; //计数器,深度优先后,保存是否在ab间 int count1=0; //辅助计数器,判断abc是否重复
void dfs(algraph g,int a,int b,int c){//g为邻接表存储的图,从第v个顶点出发递归的深度优先遍历函数
if(a==c||b==c)count1++; //如果遍历到a或b点辅助计数器加一visited[c]=1; node *p;
p=(node*)malloc(sizeof(node)); //为p申请空间
p=g.vertices[c].firstarc; //指向c的第1邻接点的指针 while(p!=null)
{
if(!visited[p->adjvex])
{ dfs(g,a,b,p->adjvex); } //访问p的顶点向量中的下标
if(p->adjvex==w&&count1==1)
count=1; //如果辅助计数器为一且遍历返回到c时计数器为一
if(count==1)break;
p=p->next; //遍历到已被遍历的顶点从此顶点的下一邻接点
}
}
void if(algraph g){ //判断c是否在a和b之间,原理是判断是否在一次探测,还是产生回溯
int d; //d为判断的次数
cout<<输入测试的次数:<<endl;
cin>>d;
值 int a[10],b[10],c[10]; //记住每次用于测试a、b、c的
cout<<输入a,b,c三个小村的编号(<<d<<次,中间用空格分开):<<endl;
for(int i=0;i<d;i++)
{ cin>>a[i]>>b[i]>>c[i]; }
cout<<显示测试结果:<<endl;
for(int j=0;j<d;j++)
{
w=c[j];
dfs(g,a[j],b[j],c[j]);
if(count==1)
cout<<yes恭喜你将找到命中的恋人<<endl;//在遍历a 或b后又重新遍历到c
if(count==0)cout<<no你将与她错过 <<endl; //在遍历了a和遍历了b之后又从新遍历到c