2013级DS作业和实验参考答案总汇(1)
更新时间:2024-01-11 20:25:01 阅读量: 教育文库 文档下载
- 2013年6月B级答案推荐度:
- 相关推荐
2013级DS作业和实验参考答案总汇目录
第一次作业:复习C++ 9000,9002
第二次作业:顺序表插入和删除操作9003,9004
第三次作业:顺序表查找操作和单链表建立9012,9006 第四次作业:单链表操作9014,9016,9017
第五次作业:特殊线性表栈操作9045,9042,9041 第六次作业:特殊线性表队列操作9038,9040 第七次作业:二叉树的顺序存储9050 第八次作业:复制二叉树9063
第九次作业:二叉树的高度宽度9057,9067
第十次作业:图的邻接矩阵及遍历9070,9072,9087 第十一次作业:图的生成树9076,9077,9088 第十二次作业:图的最短路径9092,9091,9085 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 第一次实验:顺序表9010,9005 第二次实验:顺序表2 9097 第三次实验:单链表 9007 第四次实验:循环链表9008 第五次实验:递归 9039
第六次实验:二叉树的建立及遍历9019 第七次实验:二叉树的结点9054,9056 第八次实验:二叉树的存储转换9049 第九次实验:哈夫曼编码9068
第十次实验:图的邻接表及度9071,9079
第十一次实验:图的存储转换9089,9084,9083 第十二次实验:模拟考试 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 第一次作业:复习C++9000,9002
9000:矩形面积 Problem Description
声明一个名为rect的矩形类,其属性为矩形的左下角和右上角两个点的x和y坐标,该类有效矩形只存在于直角坐标系的第一象限内。若所构成的矩形有效,则计算矩形的面积;若所构成的矩形无效,则输出“data error”。 Input
输入的第一行为一个数字n,表示下面有n组数据,每组数据包括2行;每组数据中的第一行表示矩形左下角点的x和y坐标,第二行表示矩形右上角点的x和y坐标。 Output
若所构成的矩形有效,则计算矩形的面积;若所构成的矩形无效,则输出“data error”。 Sample Input 2 2 2 4 4 1 2 3 4
Sample Output
4 4
//9000ANSWER CODE1 #include
rect::rect(int a,int b,int c,int d){ x1=a;y1=b;x2=c;y2=d;} int rect::area(){return (x2-x1)*(y2-y1);} int main(){
int a,b,c,d,n; cin>>n; while(n--) {
cin>>a>>b>>c>>d;
if(a<0||b<0||c<0||d<0||a>=c||b>=d) cout<<\ else
{ rect r(a,b,c,d); cout< return 0; } 9002:数组的循环移位 Problem Description 对于一个给定的字符型数组循环左移i位,要求尽量不申请空间,实现“原地”操作。 Input 输入的第一行为一个数字n,代表接下来有n组数据,每组数据包括2行;每组数据中的第一行为一个字符串(长度不超过50),第二行为一个数字m,代表要左移的位数。 Output 循环左移后的字符型数组内容。 Sample Input 1 abcdefgh 3 Sample Output defghabc //9002ANSWER CODE1 #include void Reverse(char a[],int from,int to) { int i,j;char t;i=from;j=to; while(i void Converse(char a[],int n,int i) { Reverse(a,0,i-1);Reverse(a,i,n-1);Reverse(a,0,n-1);} int main() { char a[N];int m,n,i;cin>>m; while(m--){ cin>>a>>i; n=strlen(a);i=i%n; Converse(a,n,i); cout< return 0; } 第二次作业:顺序表插入和删除操作9003,9004 9003:合并顺序表 Problem Description 假设有两个由小到大有序的有序顺序表A和B,现要求将表B并入表A中,且A表仍保持由小到大的有序性。若合并后的顺序表表长超过总容量20,则输出“not enough”。 Input 第一行为一个数字n,表示下面有n组数据,每组数据包括4行;每组数据中的第一行表示表A的表长,第二行表示表A的数据元素,第三行表示表B的表长,第四行表示表B的数据元素。 Output 若合并成功,输出两行信息,第一行表示合并后A表的表长,第二行表示合并后A表的数据元素,元素之间用一个空格分隔;若合并后的顺序表表长超过总容量20,则输出“not enough”。 Sample Input 1 4 1 3 8 17 3 6 10 15 Sample Output 7 1 3 6 8 10 15 17 //9003ANSWER CODE1 #include const int MaxSize=20;//有两个由小到大有序的有序顺序表A和B void combine(int A[],int A_len,int B[],int B_len) { if((A_len+B_len)>MaxSize) cout<<\ else { int i=0,j=0,k=0; for(i=0;i while(B[i]>A[j])//找到B[i]在A表中的插入位置j {j++;} for(k=A_len-1;k>=j;k--)//把j(包括j)后的元素往后挪一个位置,空出j来。 {A[k+1]=A[k];} A[j]=B[i];//把B[i]插入A表中的位置j A_len++;//A表长度加1 } cout< void main(){ int A[MaxSize], B[MaxSize], A_len, B_len, n, i; cin>>n; while(n--){ cin>>A_len; for(i=0;i>A[i];} cin>>B_len; for(i=0;i 9004:连续删除 Problem Description 从由小到大有序的顺序表中删除其值在[s, t]之间(含s和t)的所有元素,且不改变顺序表的有序性。如果s>=t则显示“data error”;否则输出顺序表的表长和顺序表中的元素,若处理后的顺序表为空,则不输出任何信息。 Input 输入的第一行为一个数字n,表示下面有n组数据,每组数据包括3行;每组数据中的第一行包含两个数字s和t,第二行为顺序表的表长len(0 对于每组数据,如果s>=t,则直接输出“data error”,否则输出两行信息:第一行为处理后顺序表的表长,第二行为处理后顺序表中的元素,元素之间用一个空格分隔,如果处理后的顺序表为空,则不输出任何信息。 Sample Input 1 8 18 7 1 3 5 10 17 19 25 Sample Output 5 1 3 5 19 25 //9004ANSWER CODE1 #include 9012:找唯一数 Problem Description 在一个表长为n的顺序表中,除一个元素之外,其余的元素都出现了两次。请找出这个仅出现一次的元素。 Input 有多组数据,每组第一行表示表长n(1<=n<=11111);第二行表示顺序表的各元素。 Output 输出这个唯一数。 Sample Input 5 2 2 1 3 1 7 2 1 1 3 -1 2 3 Sample Output 3 -1 //9012ANSWER CODE1 #include 9006:单链表的建立和遍历 Problem Description 输入N个整数,按照输入的顺序建立单链表存储,并遍历所建立的单链表,输出这些数据。 Input 输入数据有多组,每组数据占两行;每组第一行为一个数字N(N<=50);第二行有N个整数。 Output 输出这组整数,数字之间用一个空格分隔。 Sample Input 5 12 32 45 78 54 Sample Output 12 32 45 78 54 //9006ANSWER CODE1 #include struct Node{int data;Node * next;}; int main() { int N,i,A[51]; Node *head=new Node,*p,*tail; while(cin>>N) { if(N>0) { for(i=0;i 第四次作业:单链表操作9014,9016,9017 9014:删最小值 Problem Description 设有一单链表,现要求删除其最小值(假设最小值唯一)。若删除成功,则输出被删的最小值;若删除失败,则输出“not exist”。 Input 有多组数据,每组第一行为单链表的元素个数n(0<=n<100);第二行为单链表的各个元素。 Output 若删除成功,则输出被删的最小值;若删除失败,则输出“not exist”。 Sample Input 8 4 2 6 -3 1 9 14 5 5 2 4 1 6 7 Sample Output -3 1 //9014ANSWER CODE1 #include struct Node{int data;Node *next;}; int main() { int i,n,data[100],min; Node *first,*p,*q,*s,*tail; while(cin>>n) { if(n==0){cout<<\ for(i=0;i 9016:查找倒数第k个结点 Problem Description 有一单链L,请输出该单链表中倒数第k个结点的值。若该结点不存在,则输出“not find”。 Input 有多组数据,每组第一行为单链表元素个数n和k值(0 输出该单链表中倒数第k个结点的值。若该结点不存在,则输出“not find”。 Sample Input 5 1 1 2 3 4 5 5 5 1 2 3 4 5 Sample Output 5 1 //9016ANSWER CODE1 #include struct Node{int date; Node *next;}; int main() { int n,k,i,c,data[100];Node *first,*r,*p,*s; while(cin>>n>>k) { for(i=0;i 9017:统计选票 Problem Description 设有m个候选人n张选票,每张选票选且只选一人,候选人编号依次为1,2,3,...,m。现将这n张选票存于一单链表中,要求统计并输出每个候选人的得票结果。 Input 有多组数据,每组第一行为候选人总数m和选票总数n(m>0,0 输出每个候选人的得票结果,数字之间用一个空格隔开。 Sample Input 3 6 1 3 1 2 2 1 5 8 3 3 4 3 3 2 1 1 //倒数第k个就是正数第n-k+1个。 if(k<=n && k>=1) { p=first->next;c=1; while(p && c<(n-k+1)){p=p->next;c++;} if(p && c==(n-k+1)){cout< return 0; Sample Output 3 2 1 2 1 4 1 0 //9017ANSWER CODE1 #include 第五次作业:特殊线性表栈操作9045,9042,9041 9045:判栈输出序列的有效性 Problem Description 设一个栈的输入序列为1,2,3,...,n-1,n。请编写一个算法,判断一个序列p1,p2,p3,...,pn是否是一个有效的栈输出序列。若有效输出1,无效输出0。 Input 有多组数据,每组第一行为序列长度n(n<=50),第二行为一个由1~n值组成的长度为n且值无重复的序列。 Output 栈输出序列有效输出1,无效输出0。 Sample Input 3 1 2 3 3 3 1 2 Sample Output 1 0 //9045ANSWER CODE1 #include int n,i,j,in,out;//in输入序列指针,out输出序列指针 } int output[51],stack[51],top=-1; while(cin>>n) { for(i=0;i return 0; 9042:判操作序列有效性 Problem Description 假设以I和O分别表示入栈和出栈操作。栈的初态和终态均为空,入栈和出栈的操作序列可表示为仅由I和O组成的序列,称可以操作的序列为合法序列,否则成为非法序列。请编写一个对该操作序列的有效性进行判断,若有效输出1,无效输出0。 Input 有多组数据,每组为由I和O组成的序列,序列长度不超过50。 Output 操作序列有效输出1,无效输出0。 Sample Input IOIIOIOO IOOIOIIO Sample Output 1 0 //9042ANSWER CODE1 #include } if(str[i]=='I'){stack[++top]=str[i];} else if(str[i]=='O') { if(top>-1) top--; else{cout<<\ } else{cout<<\ } if(top==-1 && i==n && flag==0){cout<<\ else{if(flag==0) cout<<\} return 0; 9041:判括号匹配 Problem Description 任意输入一个由若干个圆括号、方括号和花括号组成的字符串,设计一个算法判断该串中的括号是否配对。 Input 有多组数据,每组为一个包含3类括号的字符串,串长不超过100。 Output 若该串中的括号匹配输出1,否则输出0。 Sample Input ([{}]) ([{}}) ([{)]} Sample Output 1 0 0 //9041ANSWER CODE1 #include else if((str[i]==')') && (stack[top]=='(') || (str[i]==']') && (stack[top]=='[') || (str[i]=='}') && (stack[top]=='{')){top--;} else{cout<<\ } if(top==-1 && i==len && flag==0){cout<<\ else {if(flag==0)cout<<\ } return 0; } 第六次作业:特殊线性表队列操作9038,9040 9038:循环队列的操作 Problem Description 现有一长度为n的整数序列和一最大容量为m的循环队列(用长为m+1的一维数组实现),要求将该序列中的偶数存入循环队列中;当循环队列满时,将循环队列中的所有元素全部出队,并按存入的先后顺序在同一行内依次输出,即每行输出m个元素,每个元素后输出一个空格。 Input 有多组数据,每组第一行为整数序列的个数n和循环队列的最大容量m(m<=n<=100,0 有多行数据,先输出对应行号,每行输出m个元素,均为偶数,每个元素后输出一个空格。 Sample Input 10 4 9 10 2 7 16 8 12 4 3 1 10 3 9 10 2 7 16 8 12 1 3 4 Sample Output 1:10 2 16 8 1:10 2 16 2:8 12 4 //9038ANSWER CODE1 #include } } } return 0; rear=(rear+1)%(m+1); Queue[rear]=A[i]; } if(c==m) { cout<<++l<<\ for(j=front+1;j<=rear;j++) cout< 9040:火车车厢重排 Problem Description 一列货运列车共有n节车厢,每节车厢将停放在不同的车站。假定n个车站的编号分别为1~n,即货运列车按照第n站至第1站的次序经过这些车站。为了便于从列车上卸掉相应的车厢,车厢的编号应与车站的编号相同。这样,在每个车站只需卸掉最后一节车厢。因此,对于给定的任意次序车厢,必须进行重新排列,使其符合要求。车厢重排工作可通过转轨站完成,在转轨站中有一个入轨、一个出轨和k个缓冲轨,缓冲轨位于入轨和出轨之间。假定缓冲轨按先进先出的方式工作,现要求设计算法解决火车车厢重排问题。 Input 有多组数据,每组第一行为车厢节数n和缓冲轨数目k(2<=k<=5,k<=n<=10),第二行为初始给定的车厢编号次序序列。 Output 若给定的车厢编号次序序列可重排,则输出1;否则输出0。 Sample Input 9 3 3 6 9 2 4 7 1 8 5 9 3 3 6 9 2 4 7 5 8 1 Sample Output 1 0 //9040ANSWER CODE1 #include using namespace std; int main(){ int n,k,carNum[11],i,j,rearrange; while(cin>>n>>k) { for(i=0;i for(i=0;i return 0; } 第七次作业:二叉树的顺序存储9050 9050:顺序存储的前序遍历 Problem Description 给你一个采用顺序存储结构的二叉树,请你设计一个算法求出它的前序遍历。 Input 输入数据有多组,每组的第一行为一个正数n,表示该二叉树的节点个数。 接下来有n个字符,表示各个位置上的元素,当字符为'#'时表示当前节点为空。 Output 输出该二叉树的前序遍历 Sample Input 6 ABCDEF 6 ABC#DE Sample Output ABDECF ABDCE //9050ANSWER CODE1 #include DBEACF //9063ANSWER CODE1 #include Binode *copy(Binode *bt) { Binode *bt1; if(bt==NULL) return NULL; else { bt1=new Binode; bt1->data=bt->data; bt1->lchild=copy(bt->lchild); bt1->rchild=copy(bt->rchild); } return bt1; } void Inorder(Binode *bt1) { if(bt1==NULL) return; else { Inorder(bt1->lchild); cout< int main() { int n; cin>>n; while(n--) { Binode *bt=Great(); Binode *bt1=copy(bt); Inorder(bt1); if(bt1!=NULL) } cout< return 0; //9063ANSWER CODE2 #include struct BiNode{ char data; BiNode *lchild, *rchild;}; BiNode *Creat() { BiNode *bt;char ch; cin>>ch; if(ch=='#')bt=NULL; else { bt=new BiNode; bt->data=ch; bt->lchild=Creat(); bt->rchild=Creat(); } return bt; } void InOrder(BiNode *root) { if (root==NULL) return; //递归调用的结束条件 else{ InOrder(root->lchild); //中序递归遍历root的左子树 cout< //层序遍历复制二叉树 BiNode * copy_bitree(BiNode * root) { int front=-1,rear=-1,newfront=-1,newrear=-1; BiNode * Q[100],* newQ[100],*oldp,* newp,*newroot; if(root==NULL ) return NULL;//空二叉树 oldp=root; newp=new BiNode; newp->data=oldp->data; newroot=newp;//新二叉树的根指针 Q[++rear]=oldp;//入队 newQ[++newrear]=newp;//入队 while(rear!=front) { oldp=Q[++front];//出队 newp=newQ[++newfront];//出队 if(oldp->lchild==NULL) newp->lchild=NULL; else { newp->lchild=new BiNode; newp->lchild->data=oldp->lchild->data; Q[++rear]=oldp->lchild; newQ[++newrear]=newp->lchild; } if(oldp->rchild==NULL) newp->rchild=NULL; else { newp->rchild=new BiNode; newp->rchild->data=oldp->rchild->data; Q[++rear]=oldp->rchild; newQ[++newrear]=newp->rchild; } } return newroot; } void main() { int n; BiNode * root,*newroot; cin>>n; while(n--) { root=Creat(); newroot=copy_bitree(root); if(newroot==NULL) continue; } } InOrder(newroot);//中序遍历新二叉树 cout< 第九次作业:二叉树的高度宽度9057,9067 9057:Tree's Depth Problem Description 一个名字叫Small Green的同学,很喜欢研究树的问题。某一天,他随意地在纸上乱涂乱画,画出了各不相同的二 叉树,他同时在想:一颗满的二叉树的深度并不难求。但如果要求出一颗二叉树(可能不是满二叉树)的深度,那么该如何求呢? Input 输入包含多个例子,每个例子的第一行为一个整数n,表示以下有n组数据,每组数据占一行,为扩展二叉树的前序遍历序列(长度小于50,若节点为NULL则用'#'表示,否则用小写字母表示)。 Output 输出该二叉树的深度。 Sample Input 2 abcd####efg#### abcd####efg#h###i## Sample Output 4 5 //9057ANSWER CODE1 #include struct BiNode{char data;BiNode *lchild,*rchild;}; BiNode *Creat() { BiNode *p; char ch; cin>>ch; if(ch=='#') return NULL; else { p=new BiNode; p->data=ch; p->lchild=Creat(); p->rchild=Creat(); } return p; } int Depth(BiNode *bt) { int l,r; if(bt==NULL) return 0; else { l=Depth(bt->lchild); r=Depth(bt->rchild); return (l>=r)?(l+1):(r+1); } } main() { int n; while(cin>>n) { while(n--) { BiNode *p=Creat(); cout< //9057ANSWER CODE2 #include struct BiNode{char data;BiNode *lchild,*rchild;}; int deep; BiNode *Creat(int i) { BiNode *p; char ch; cin>>ch; if(ch=='#') return NULL; //9067ANSWER CODE1 #include struct BiNode{char data;BiNode *lchild,*rchild,*parent;int level;BiNode(){parent=NULL;level=1;}}; class BiTree{ public: BiTree(){root=Creat(); } ~BiTree(){Release(root);} void PreOrder(){PreOrder(root);} private: BiNode *root; BiNode *Creat(); void PreOrder(BiNode *root); void Release(BiNode *root); }; int W[51]; int main(){ int n,i,max;cin>>n; while(n--){ max=0; for(i=0;i<51;i++) W[i]=0; BiTree bt; bt.PreOrder(); for(i=0;i<51;i++){if(W[i]>max) max=W[i];} cout< BiNode *BiTree::Creat(){ char ch;BiNode *p; cin>>ch; if(ch=='#') p=NULL; else{ p=new BiNode;p->data=ch; p->lchild=Creat();if(p->lchild){p->lchild->parent=p;} p->rchild=Creat();if(p->rchild){p->rchild->parent=p;} } return p; } void BiTree::PreOrder(BiNode *root){ if(root==NULL) return; else{ if(root->parent)root->level=root->parent->level+1; W[root->level]=W[root->level]+1; PreOrder(root->lchild); PreOrder(root->rchild); } } void BiTree::Release(BiNode *root){ if(root!=NULL) { Release(root->lchild); Release(root->rchild); delete root; } } //9067ANSWER CODE2 #include struct BiNode{char data;BiNode *lchild,*rchild;}; BiNode* Creat(int i) { BiNode *p;char ch; cin>>ch; if(ch=='#') return NULL; else { p=new BiNode; p->data=ch; sum[i]++; p->lchild=Creat(i+1); p->rchild=Creat(i+1); } return p; } int main() { int n,i,width;BiNode *root; while(cin>>n) { while(n--) { memset(sum,0,sizeof(sum)); root=Creat(1); width=0; for(i=1;i<100;i++) if(width 第十次作业:图的邻接矩阵及遍历9070,9072,9087 9070:求度最大的顶点编号 Problem Description 设有一无向图G,采用邻接矩阵存储,现要求设计一个函数,用于求图中度数最大的顶点,并输出其对应的存储编号(下标)。(注:度数最大的顶点可能有多个) Input 有多组测试数据,每组数据的第一行表示图的顶点数n和图的边数e(0 度数最大的顶点对应的存储编号(下标),各下标之间用空格隔开。 Sample Input 4 4 ABCD 0 1 0 3 1 2 1 3 Sample Output 1 //9070ANSWER CODE1 #include } //9070ANSWER CODE2 #include for(i=0;i return 0; 9072:存储网图 Problem Description } 设有一无向网图,其顶点值为字符型并假设各值互不相等,采用邻接矩阵表示法存储表示。设计一个算法,存储该网图并输出其邻接矩阵。 Input 有多组测试数据,每组数据的第一行为两个整数n和e,表示n个顶点和e条边(0 输出该网图的邻接矩阵,每组输出占n行,每行有n个数据,每两个数据之间用一个空格隔开,若无边用'#'表示。 Sample Input 4 4 ABCD 0 1 4 0 3 3 1 2 6 1 3 8 Sample Output 0 4 # 3 4 0 6 8 # 6 0 # 3 8 # 0 //9072ANSWER CODE1 #include } cin>>i>>j>>w; arc[i][j]=w; arc[j][i]=w; } for(i=0;i 9087:邻接矩阵遍历 Problem Description 给出一个无向图的各个点之间的邻接关系,输出遍历序列。 Input 有多组数据,每组数据第一行有两个整数n、m,(0 分别输出从标号为1点开始深度和广度优先搜索的序列,每个数之后有一个空格。每个序列分别占一行。 Sample Input 8 9 1 2 1 3 2 4 2 5 3 6 3 7 4 5 4 8 6 7 Sample Output 1 2 4 5 8 3 6 7 1 2 3 4 5 6 7 8 //9087ANSWER CODE1 #include int n,visited[100],visited2[100],arc[100][100]; void DFS(int v) { cout< void BFS(int v) { int front=-1,rear=-1,Q[100]; cout< void main() { int m,i,j,k; while(cin>>n>>m) { for (i=1; i<=n; i++) { for (j=1; j<=n; j++)arc[i][j]=0;} for(k=0;k } 第十一次作业:图的生成树9076,9077,9088 9076:深度优先生成树 Problem Description 设有一连通无向图,其顶点值为字符型并假设各值互不相等,采用邻接矩阵表示法存储表示。利用DFS算法求其深度优先生成树(从下标0的顶点开始遍历),并在遍历过程中输出深度优先生成树的每一条边。 Input 有多组测试数据,每组数据的第一行为两个整数n和e,表示n个顶点和e条边(0 输出深度优先生成树的每一条边,每组输出占一行,每条边信息之间有一空格,每行最后均有一空格,具体格式见样例。 Sample Input 4 4 ABCD 0 1 0 3 1 2 1 3 Sample Output (A,B) (B,C) (B,D) //9076ANSWER CODE1 #include int n,visited[100],arc[100][100];char vertex[20]; void DFS_spanningTree(int v) { visited[v]=1; for (int j=0; j void main() { int e,i,j,k; while(cin>>n>>e>>vertex) { for (i=0; i } 9077:广度优先生成树 Problem Description 设有一连通无向图,其顶点值为字符型并假设各值互不相等,采用邻接矩阵表示法存储表示。利用BFS算法求其广度优先生成树(从下标0的顶点开始遍历),并在遍历过程中输出广度优先生成树的每一条边。 Input 有多组测试数据,每组数据的第一行为两个整数n和e,表示n个顶点和e条边(0 输出广度优先生成树的每一条边,每组输出占一行,每条边信息之间有一空格,每行最后均有一空格,具体格式见样例。 Sample Input 4 4 ABCD 0 1 0 3 1 2 1 3 Sample Output (A,B) (A,D) (B,C) //9077ANSWER CODE1 #include int n,visited[100],arc[100][100];char vertex[20]; void BFS_spanningTree(int v) { int front=-1,rear=-1,Q[100];; visited[v]=1;Q[++rear]=v; while (front!=rear) { v=Q[++front]; for (int j=0; j void main() { int e,i,j,k; while(cin>>n>>e>>vertex) { for (i=0; i 9088:村村相连 Problem Description 漳州市政府调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离。市政府的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可),并要求铺设的公路总长度 为最小。请计算最小的公路总长度。 Input 测试输入包含若干测试用例。每个测试用例的第1行给出村庄数目N(N<100)和M;随后的M行对应村庄间的距离,每行给出一对正整数,分别是两个村庄的编号,以及此两村庄间的距离。为简单起见,村庄从1到N编号。 当N、M为0时,输入结束,该用例不被处理。 Output 对每个测试用例,在1行里输出最小的公路总长度,如果未能找到请输出\。 Sample Input 3 3 1 2 1 1 3 2 2 3 4 4 6 1 2 1 1 3 4 1 4 1 2 3 3 2 4 2 3 4 5 0 0 Sample Output 3 5 //9088ANSWER CODE1 #include int i,j,k,count_cc=1;//当count_cc=n时连通,否则不连通输出no found! int length=0;//最小的公路总长度(即最小生成树的代价) int lowcost[100],adjvex[100]; for (i=2; i<=n; i++) //初始化lowcost[]和adjvex[] { lowcost[i]=arc[1][i]; adjvex[i]=1; } lowcost[1]=0; //将顶点0加入集合U中 for (i=2; i<=n; i++) { int weight_min=10000;k=0; for(j=2;j<=n;j++) { if(lowcost[j]!=0 && lowcost[j]!=10000 && lowcost[j] } if(lowcost[k]==10000 || k==0) break; count_cc++; length=length+lowcost[k]; lowcost[k]=0; //将顶点k加入集合U中 for (j=2; j<=n; j++) //调整lowcost和adjvex if (arc[k][j] void main() { int m,i,j,k,w;; while(cin>>n>>m) { if(n==0) return; for (i=1; i<=n; i++) {for (j=1; j<=n; j++){arc[i][j]=10000;}} for (i=1; i<=n; i++)arc[i][i]=0; } for (k=0; k 第十二次作业:图的最短路径9092,9091,9085 9092:最短路 Problem Description “水上之都”威尼斯水城是个美丽的地方,ax幻想着某天能够去那里旅游! 一天,ax想到一个问题: 威尼斯由许多n个小岛(由0到n-1编号)以及m座桥梁连成一体!假设ax在s号小岛上,要去t号小岛游玩!那么s到t的最短距离是多少! Input 本题目包含多组数据,每组数据第一行包含两个正整数n和m(0 再接下一行有两个整数s,t(0<=s,t } Output 对于每组数据,请在一行里输出最短距离,如果不存在s到t的路径则输出\。 Sample Input 3 3 0 1 1 0 2 3 1 2 1 0 2 3 1 0 1 1 1 2 Sample Output 2 not found! //9092ANSWER CODE1 #include void Dijk(int v, int v_end)//v源点,v_end终点 { int dist[200],S[200],i,k,num,min; for (i=0; i while (num min=10000;k=v;//min为dist[]最小值的下标k for (i=0; i for (i=0; i dist[k]=0; //置k为已生成终点 } cout<<\} void main() { int m,s,t,i,j,k,w; while(cin>>n>>m) { for (i=0; i } 9091:名次排序 Problem Description 有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序确定排名。 Input 输入有若干组,每组中的第一行为二个数N(1<=N<=500)和M,其中N表示队伍的个数,M表示接着有M行的输入数据。接下来的M行数据中,每行也有两个整数P1和P2,表示P1队赢了P2队。 Output 给出一个符合要求的排名。输出时队伍号之间有空格,最后一名后面没有空格。 其他说明:符合条件的排名可能不是唯一的,此时要求输出时编号小的队伍在前;输入数据保证是正确的,即输入数据确保一定能有一个符合要求的排名。 Sample Input 4 3 1 2 2 3 4 3 Sample Output 1 2 4 3 //9091ANSWER CODE1 #include { int m,i,j,k,f,num,indg[500],visit[500]; while(cin>>n>>m) { for (i=1; i<=n; i++){for (j=1; j<=n; j++)arc[i][j]=0;} for(k=0;k } for (j=1; j<=n; j++) {for (i=1; i<=n; i++){indg[j]+=arc[i][j];}} f=0;num=0; while(num cout< } //9091ANSWER CODE2 #include struct arcNode{int adjvex;arcNode *next;}; struct vertexNode{int in;int vertex;arcNode *firstedge;}; int n;vertexNode adjlist[500]; void main() { int m,i,j,k;arcNode *s,*p; while(cin>>n>>m) { for (i=1; i<=n; i++) { adjlist[i].in=0; adjlist[i].vertex=i; adjlist[i].firstedge=NULL; } for (k=0; k while(top!= -1 ) //当图有入度为0的顶点时循环 } } { j=S[top--]; //从栈中取出一个入度为0的顶点 if(f==0){cout< p=adjlist[j].firstedge;//扫描顶点表,找出顶点j的所有出边 while(p) { adjlist[p->adjvex].in--;//将入度减1,=0顶点入栈 if (adjlist[p->adjvex].in==0) S[++top]=p->adjvex; p=p->next; } } cout< 9085:逆邻接表 Problem Description 对每个顶点vi将所有以顶点vi为弧头的弧链接起来,形成入边表,可以建立有向图的逆邻接表,从而便于求顶点的入度。设有一有向图G,其顶点值为字符型并假设各值互不相等,要求采用逆邻接表表示法存储。设计一个算法,存储该有向图并输出各顶点的入边信息。 Input 有多组测试数据,每组数据的第一行为两个整数n和e,表示n个顶点和e条边(0 输出该有向图中所有顶点的入边信息(空表不输出任何信息),每行最后均无空格,每两组数据之间有一空行,具体格式见样例。 Sample Input 4 4 ABCD 0 1 0 3 1 2 1 3 4 4 ABCD 0 1 0 2 2 3 3 0 Sample Output 1->0 2->1 3->1->0 0->3 1->0 2->0 3->2 //9085ANSWER CODE1 #include struct arcNode{int adjvex;arcNode *next;}; struct vertexNode{char vertex;arcNode *firstedge;}; void main() { int n,e,i,j,k,f=0;char vex[20];vertexNode adjlist[20];arcNode *s,*p; while(cin>>n>>e>>vex) { if(f)cout< } !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 第一次实验:顺序表9010,9005 9010:拆分顺序表 Problem Description 有一顺序表A,请将其拆分成两个顺序表B和C,使A中大于0的元素存放在B中,小于或等于0的元素存放在C中。 Input 有多组数据,每组第一行表示A表长n(0 将顺序表B和C的元素分两行输出,每行中相邻两元素之间用一个空格分隔,空表则不输出任何信息。 Sample Input 9 11 3 -3 3 -4 0 -2 6 32 Sample Output 11 3 3 6 32 -3 -4 0 -2 //9010ANSWER CODE1 #include } 9005:最长相等子序列长度 Problem Description 给定一个有n个元素的整数数组b,b中连续的相等元素构成的子序列称为平台。设计一个算法求b中最长平台的长度。 Input 第一行为一个数字m,表示下面有m组数据,每组数据包括2行;每组数据中的第一行表示数组的长度n(不会超 过20,但可为空表),第二行表示数组的所有元素。 Output 输出最长平台的长度。 Sample Input 2 8 11 3 8 8 8 8 8 7 10 11 3 3 25 8 8 8 8 8 7 Sample Output 5 5 //9005ANSWER CODE1 #include 第二次实验:顺序表2 9097 9097:杀猪!! Problem Description 一户人家养了一群猪(n头,编号1,2,3....n),每头猪都有自己初始体重w(double)和体重增长率x。每天猪的体重都会 发生变化,是胖是瘦取决于体重增长率,体重增长率为负,变瘦,为正,变胖。(体重增长率:double,-0.2 输入数据有多组,每组数据第一行为猪的头数n(0 第二行为n头猪的体重 第三行为n头猪的体重增长率 Output 按先后被杀的顺序输出猪的编号。每组输出数据,输出一行,编号之间用逗号隔开 Sample Input 6 4 32 99 3 2 45 0.1 -0.15 0 -0.19 0.19 -0.04 Sample Output 3,6,2,1,5,4 //9097ANSWER CODE1 #include int n,i,j,flag,maxi;double max;//max一定是double类型 while(cin>>n) { if(n<=50 && n>0) { double * pw=new double[n+1]; double * px=new double[n+1]; for(i=1;i<=n;i++)cin>>pw[i]; for(i=1;i<=n;i++)cin>>px[i]; flag=1; for(j=1;j<=n;j++) { max=0;maxi=0; for(i=1;i<=n;i++){if(pw[i]>max){max=pw[i];maxi=i;}} if(flag==1){cout< return 0; } 第三次实验:单链表9007 9007:单链表按值操作 Problem Description 对值递增有序的单链表进行以下操作:若表中存在值为x的结点,则将它从表中删除;否则,就往表中插入一个值为x的结点,并保持表值递增有序的性质不变(假设表中没有值相同的元素)。处理后若为空表则不输出。 Input 每组数据包括3行,第一行表示单链表的长度n(不会超过50);第二行表示单链表的所有元素;第三行表示x值。 Output 输出执行操作后的单链表,元素之间用一个空格分隔。 Sample Input 5 1 3 5 7 9 3 5 1 3 5 7 9 4 Sample Output 1 5 7 9 1 3 4 5 7 9 //9007ANSWER CODE1 #include struct Node{ int data; Node * next;}; int main(){ int i,n,x,A[51]; Node *p,*first,*q,*r,*s; while(cin>>n){ if(n==0){ cin>>x; cout< 4 6 //9054ANSWER CODE1 #include struct BiNode{char data;BiNode *lchild,*rchild;}; int num=0; BiNode *Creat(){ char ch;BiNode *p; cin>>ch; if(ch=='#') return NULL; else {p=new BiNode;p->data=ch;num++; t && t_i>=0) t_i--; if(s_i<=t_i) { span=t_i-s_i+1; for(j=s_i;j
正在阅读:
文明礼仪在身边作文700字07-09
七年级地理培优辅潜工作计划04-16
新产品研发合作协议书范本(含注意事项)07-24
大学经济学教学改革研究12-12
妈妈的关心作文400字06-19
山东大学微生物各个章节学习辅导 - 图文01-29
《清稗类钞》服饰类04-12
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 总汇
- 作业
- 答案
- 参考
- 实验
- 2013
- 人类染色体标本制备经验手册
- 负环管片安装及加固作业指导书
- 我院42名应届毕业生被澳门大学、澳门科技大学录取为硕士研 …
- IT运维管理系统项目实施方案
- 家族企业吸纳人才和培养问题研究-论文工商管理
- 青田县政府采购
- 矩阵的意义
- 物业学习心得体会
- 2010年江苏省南京市中考《英语》试题及答案
- 国土资源部关于开展土地整治规划编制工作的通知2010162号文件
- 南京工业大学2010-2011学年第二学期《高等数学》试卷和参考答案
- 初中语文八年级下学期语文第五单元24送东阳马生序导学案
- 某油库设计储油区的工艺计算
- 超星慕课尔雅二零一六就业指导答案(DOC)
- 课程设计参考:机械式变速器设计
- 2009年高考地理试题分类汇编1 自然地理2
- 学校教学质量分析报告
- Unit 3 Lying全新版大学英语综合教程五课文翻译
- 二级综合医院评价指标参考值
- 胃癌肿瘤标志物在手术前后检测临床意义的表达