图论实验报告(代码)学号:1241902129姓名:肖尧1.写一个程序,输入一个图,一对顶点和通路长度,输出两个顶点间指定长度的通路。
程序代码:#include<stdlib.h>#include<stdio.h>#include<iostream>using namespace std;#define MAX 20typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct VNode{char data;ArcNode *firstarc;}VNode,AdjList[MAX];typedef struct{AdjList vertices;int n,e;}MGraph;int path[MAX];int visited[MAX];//返回字符v 在图中的位置int LocateV ex(MGraph G, char v){int i;for(i=0;i<G.n;i++){if(G.vertices[i].data==v) {return i;break;}}return -1;}//得到顶点 Vichar GetV alue(MGraph G,int i)1{return (i>=0 && i<G.n) ? G.vertices[i].data : NULL;}//判断字符m 是否在图中int IsIn(MGraph G,char m){int p;for(p=0;p<G.n;p++){if(G.vertices[p].data==m)return p;}return -1;}//创建图void CreatGraph(MGraph &G){int i,k;char m,n;ArcNode *s;cout<<"请输入顶点数和边数: ";cin>>G.n>>G.e;cout<<endl;while(G.n>20){cout<<"输入的数字不符合要求,请重新输入: ";cin>>G.n>>G.e;}while(G.e>((G.n-1)*G.n/2)){cout<<"输入的数字不符合要求,请重新输入: ";cin>>G.e;}cout<<"请输入各顶点的名称: ";//建立顶点表for(i=0;i<G.n;i++){cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;//初始化图}cout<<endl;//输入边for(k=0;k<G.e;k++)2{int a,b,p,q;cout<<"请输入有边的2 个顶点: ";cin>>m>>n;cout<<endl;p=IsIn(G,m);q=IsIn(G,n);while(p==-1||q==-1){cout<<"输入的数字不符合要求,请重新输入: ";cin>>m>>n;p=IsIn(G,m);q=IsIn(G,n);}a=LocateV ex(G, m);b=LocateV ex(G, n);//生成边表结点s=(ArcNode*)malloc(sizeof(ArcNode));s->adjvex=a;s->nextarc= G.vertices[b].firstarc;//将顶点m 插入到顶点n 之后G.vertices[b].firstarc=s;s=(ArcNode*)malloc(sizeof(ArcNode));s->adjvex=b;s->nextarc= G.vertices[a].firstarc;//将顶点n 插入到顶点m 之后G.vertices[a].firstarc=s;}}//k 是要判断的长度,x,y 为给定的两个点的地址int Search(MGraph G,int x,int y,int k,int visited[],int path[],int d){int n,i;ArcNode *p;visited[x]=1;d++;path[d]=x;if(x==y && d==k)return 1;p=G.vertices[x].firstarc;while(p !=NULL){n=p->adjvex;3if(visited[n]==0){if((i=Search(G,n,y,k,visited,path,d))==1)return i;}p=p->nextarc ;}visited[x]=0;d--;return 0;}int main(){char m,n; intx,y,k,j;for( int i=0;i<MAX;i++){visited[i]=0;}cout<<"本程序的功能:输入一个图,一对顶点和通路长度,输出两个顶点间指定长度的通路数。
"<<endl<<endl;MGraph G;CreatGraph(G);cout<<"寻找路径的两个顶点: ";cin>>m>>n;cout<<endl;while(IsIn(G,m)==-1 || IsIn(G,n)==-1){cout<<"顶点不符合要求,请重新输入: ";cin>>m>>n;}cout<<"请输入想寻找的简单路径的长度:";cin>>k;cout<<endl;x=LocateV ex(G,m);y=LocateV ex(G,n);j=Search(G,x,y,k,visited,path,-1);if(j==1){cout<<"两个顶点间长度为"<<k<<"的通路: ";for(int i=0;i<k;i++){cout<<GetV alue(G,path[i])<<" => ";4}cout<<n<<endl;}else cout<<"长度为"<<k<<"的路径不存在!"<<endl;system("pause");}运行结果(以P287页(图7 - 2.8)数据为例):2.编程用图的关联矩阵实现结点的合并,并输出合并后图的关联矩阵。
程序代码:#include <iostream>#include <iomanip> usingnamespace std;typedef struct Node{int v;}Node;typedef struct Edge{int e0;Node begin;Node end;}Edge;5Node node[20];Edge edge[50];int Incidence_Matrix [50][50];int Incidence_Matrix_2 [50][50];void inite(int m,int n);void memset(int m,int n);void mergence(int m,int n,int merge_node1,int merge_node2);//初始化顶点和边void inite(int m,int n){int i,j,a,b;for (i=0;i<m;i++){node[i].v=i;}for (j=0;j<n;j++){cout<<endl;cout<<"请按照边的序号输入边的2 个顶点: ";cin>>a>>b;edge[j].e0=j;edge[j].begin.v=a-1;edge[j].end.v=b-1;}}//设置关联矩阵void memset(int m,int n){int i,j;for (i=0;i<m;i++){for (j=0;j<n;j++){if ((node[i].v==edge[j].begin.v)||(node[i].v==edge[j].end.v)){Incidence_Matrix [i][j]=1;}}}cout<<endl;cout<<"完全关联矩阵: "<<endl;6for (i=0;i<m;i++){cout<<setw(3);for (j=0;j<n;j++){cout<<Incidence_Matrix [i][j]<<setw(3);}cout<<endl;}cout<<endl;}//相关结点合并及合并后图的关联矩阵输出void mergence(int m,int n,int merge_node1,int merge_node2){int i,j;int p=0,q=0;//两顶点合并及消失点标记for (j=0;j<n;j++){Incidence_Matrix [merge_node1-1][j]=Incidence_Matrix [merge_node1-1][j] +Incidence_Matrix [merge_node2-1][j];if (Incidence_Matrix [merge_node1-1][j]==2){Incidence_Matrix [merge_node1-1][j]=0;}Incidence_Matrix [merge_node2-1][j]=-1;}//在合并后图的关联矩阵中消去标记顶点行for (i=0;i<m;i++){for (j=0;j<n;j++){if (Incidence_Matrix [i][j]!=-1){Incidence_Matrix_2 [p][q]=Incidence_Matrix [i][j];q++;if (q==n){q=0; p++;}7}}}//输出合并后图的关联矩阵cout<<endl;cout<<"合并后图的完全关联矩阵: "<<endl;for (i=0;i<m-1;i++){cout<<setw(3);for (j=0;j<n;j++){cout<<Incidence_Matrix_2 [i][j]<<setw(3);}cout<<endl;}cout<<endl;}void main(void){int m,n,merge_node1,merge_node2;cout<<"本程序的功能:输入一个图,用图的关联矩阵实现结点的合并,并输出合并后图的关联矩阵。