神秘国度的爱情故事 (精选范文)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

相关文档
最新文档