实验5: 图的基本操作

第1关:基于邻接表的新顶点的增加

任务描述

给定一个无向图,在此无向图中增加一个新顶点。

编程要求

输入

多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有一个数字f,代表新插入的顶点编号。当n和m都等于0时,输入结束。

输出

每组数据输出n+1行。为增加顶点后的邻接表。每两个数字之间用空格隔开。

测试说明

平台会对你编写的代码进行测试:

测试输入:

3 2

1 2

2 3

4

2 1

1 2

4 0

0

预期输出:

1 2

2 3 1

3 2

4

1 2

2 1

4

上答案:

 #include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MVNum 100
using namespace std;
 
typedef struct VNode{
	int data;
	struct VNode *next;
}VNode,*NodeList;

typedef struct{
	NodeList V[MVNum];
	int vexnum,arcnum;
}ALGragh ;
 
int CreateUDG(ALGragh  &G,int vexnum,int arcnum){
	G.vexnum = vexnum;
	G.arcnum = arcnum;
	for(int j=1;j<=vexnum; j ++){
		G.V[j] = new VNode;
		G.V[j]->next = NULL;
		G.V[j]->data = j;
	}
    for(int i=0;i<arcnum;i++){
		int v1,v2;
		cin>>v1>>v2;
		NodeList p3 =new VNode;
		p3->data =v2;
		p3->next =G.V[v1]->next;
		G.V[v1]->next = p3;
		NodeList p4 =new VNode;
		p4->data = v1;
		p4->next = G.V[v2]->next;
		G.V[v2]->next = p4;	
	}
	return OK;
}
 
int InsertVex(ALGragh  &G){
	int data;
	cin>>data;
	G.vexnum++;
	G.V[G.vexnum] = new VNode;
    G.V[G.vexnum]->data = data;
    G.V[G.vexnum]->next = NULL;
    return OK;
}
 
int PrintGraph(ALGragh  G){
	for(int i=1;i<=G.vexnum;i++){
		NodeList p =G.V[i];
		while(p->next){
			cout<<p->data<<" ";
			p = p->next;
		}
		cout<<p->data<<endl; 
	}
	return OK;
}

第2关:基于邻接矩阵的新顶点的增加

任务描述

给定一个无向图,在此无向图中增加一个新顶点。

编程要求

输入

多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有一个数字f,代表新插入的顶点编号。当n和m都等于0时,输入结束。

输出

每组数据输出n+1行。为增加顶点后的邻接矩阵。每两个数字之间用空格隔开。

测试说明

平台会对你编写的代码进行测试:

测试输入:

3 2

1 2

2 3

4

2 1

1 2

4 0

0

预期输出:

0 1 2 3 4

1 0 1 0 0

2 1 0 1 0

3 0 1 0 0

4 0 0 0 0

0 1 2 4

1 0 1 0

2 1 0 0

4 0 0 0

上答案:

#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MVNum 100     //最大顶点数
using namespace std;
typedef struct
{//图的邻接矩阵存储表示
	int vexs[MVNum];    //顶点表
	int arcs[MVNum][MVNum];    //邻接矩阵
	int vexnum,arcnum;     //图的当前点数和边数
}AMGragh;
int CreateUDN(AMGragh &G,int vexnum,int arcnum)
{//采用邻接矩阵表示法,创建无向网G
    G.vexnum=vexnum;
    G.arcnum=arcnum;
    if(G.vexnum>MVNum)
    return ERROR;
    for(int i=0;i<=G.vexnum;i++)
    G.arcs[0][i]=G.arcs[i][0]=i;
    for(int i=1;i<=G.vexnum;i++)
       for(int j=1;j<=G.vexnum;j++)
       G.arcs[i][j]=0;
       int h,k;
       for(int i=1;i<=G.arcnum;i++)
       {
           cin>>h>>k;
           G.arcs[h][k]=G.arcs[k][h]=1;
       }
       return OK;



}
int InsertVex(AMGragh &G)
{//在以邻接矩阵形式存储的无向图G上插入顶点
    if(G.vexnum+1>MVNum)
    return ERROR;
    int x;
    cin>>x;
    G.vexnum++;
    G.arcs[0][G.vexnum]=G.arcs[G.vexnum][0]=x;
    for(int i=1;i<=G.vexnum;i++)
    G.arcs[G.vexnum][i]=G.arcs[i][G.vexnum]=0;
    return OK;



}
int OutputUDN(AMGragh G)
{//输出图G
for(int i=0;i<=G.vexnum;i++)
{
    for(int j=0;j<G.vexnum;j++)
    cout<<G.arcs[i][j]<<" ";
    cout<<G.arcs[i][G.vexnum]<<endl;
}
return OK;

}

第3关:基于邻接表的顶点的删除

任务描述

给定一个无向图,在此无向图中删除一个顶点。

编程要求

输入

多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有一个数字f,代表删除的顶点编号。当n和m都等于0时,输入结束。

输出

每组数据输出n-1行。为删除顶点后的邻接表。每两个数字之间用空格隔开。

测试说明

平台会对你编写的代码进行测试:

测试输入:

3 2

1 2

2 3

1

2 1

1 2

2

0 0

预期输出:

2 3

3 2

1

上答案:
 

#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MVNum 100
using namespace std;
 
typedef struct VNode{
	int data;
	struct VNode *next;
}VNode,*NodeList;

typedef struct{
	NodeList V[MVNum];
	int vexnum,arcnum;
}ALGragh ;
 
int CreateUDG(ALGragh  &G,int vexnum,int arcnum){
	G.vexnum = vexnum;
	G.arcnum = arcnum;
	for(int j=1;j<=vexnum; j ++){
		G.V[j] = new VNode;
		G.V[j]->next = NULL;
		G.V[j]->data = j;
	}
    for(int j=0;j<arcnum;j++){
		int v3,v4;
		cin>>v3>>v4;
		NodeList p1 =new VNode;
		p1->data =v4;
		p1->next =G.V[v3]->next;
		G.V[v3]->next = p1;
		NodeList p2 =new VNode;
		p2->data = v3;
		p2->next = G.V[v4]->next;
		G.V[v4]->next = p2;	
	}
	return OK;
}
 
int DeleteVex(ALGragh &G)
{
	int d1,i;
	cin>>d1;
	NodeList q1;
	for(i=1;i<=G.vexnum;i++)
	{
		q1=G.V[i];
		while(q1->next)
		{
			if(q1->next->data==d1)
			{
				q1->next=q1->next->next;
				break;
			}
			q1=q1->next;
		}
	}
	for(i=d1;i<G.vexnum;i++)
		G.V[i]=G.V[i+1];
	G.vexnum--;
	return OK;
}
 
int PrintGraph(ALGragh  G){
	for(int j=1;j<=G.vexnum;j++){
		NodeList p =G.V[j];
		while(p->next){
			cout<<p->data<<" ";
			p = p->next;
		}
		cout<<p->data<<endl; 
	}
	return OK;
}

第4关:基于邻接矩阵的顶点的删除

任务描述

给定一个无向图,在此无向图中删除一个顶点。

编程要求

输入

多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有一个数字f,代表删除的顶点编号。当n和m都等于0时,输入结束。

输出

每组数据输出n-1行。为删除顶点后的邻接矩阵。每两个数字之间用空格隔开。

测试说明

平台会对你编写的代码进行测试:

测试输入:

3 2

1 2

2 3

1

2 1

1 2

2

0 0

预期输出:

0 2 3

2 0 1

3 1 0

0 1

1 0

上答案:
 

#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MVNum 100     //最大顶点数
using namespace std;
typedef struct
{//图的邻接矩阵存储表示
	int vexs[MVNum];    //顶点表
	int arcs[MVNum][MVNum];    //邻接矩阵
	int vexnum,arcnum;     //图的当前点数和边数
}AMGragh;
int CreateUDN(AMGragh &G,int vexnum,int arcnum)
{//采用邻接矩阵表示法,创建无向网G
    G.vexnum=vexnum;
    G.arcnum=arcnum;
    if(G.vexnum>MVNum)
    return ERROR;
    for(int i=0;i<=G.vexnum;i++)
    G.arcs[0][i]=G.arcs[i][0]=i;
    for(int i=1;i<=G.vexnum;i++)
       for(int j=1;j<=G.vexnum;j++)
       G.arcs[i][j]=0;
       int h,k;
       for(int i=1;i<=G.arcnum;i++)
       {
           cin>>h>>k;
           G.arcs[h][k]=G.arcs[k][h]=1;
       }
       return OK;
	
}
int DeleteVex(AMGragh &G)
{//在以邻接矩阵形式存储的无向图G上删除顶点v
  	int i,j,x;
      cin>>x;
      for(i=0;i<=G.vexnum;i++)
      for(j=x;j<G.vexnum;j++)
      G.arcs[i][j]=G.arcs[i][j+1];
      for(j=0;j<=G.vexnum;j++)
      for(i=x;i<G.vexnum;i++)
      G.arcs[i][j]=G.arcs[i+1][j];
      G.vexnum--;
      return OK;
}
int OutputUDN(AMGragh G)
{//输出图G
    for(int i=0;i<=G.vexnum;i++)
{
    for(int j=0;j<G.vexnum;j++)
    cout<<G.arcs[i][j]<<" ";
    cout<<G.arcs[i][G.vexnum]<<endl;
}
return OK;
}

第5关:基于邻接表的新边的增加

任务描述

给定一个无向图,在此无向图中增加一条边。

编程要求

输入

多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有两个数字f和g,代表增加的边所依附的两个顶点。当n和m都等于0时,输入结束。

输出

每组数据输出n行。为增加边后的邻接表。每两个数字之间用空格隔开。

测试说明

平台会对你编写的代码进行测试:

测试输入:

3 2

1 2

2 3

3 1

3 1

1 2

1 3

0 0

预期输出:

1 3 2

2 3 1

3 1 2

1 3 2

2 1

3 1

上答案:
 

#include<iostream>
using namespace std;
#define OK 1
#define ERROR -1
#define MAX 100
typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode,*LinkList;
typedef struct
{
	int vexnum;
 	int arcnum;
	LinkList V[MAX];
}ALGragh;
int CreateUDG(ALGragh &G,int vexnum,int arcnum)
{
	G.vexnum=vexnum;
	G.arcnum=arcnum;
	if(G.vexnum>MAX)
    	return ERROR;
  	for(int i=1;i<=vexnum;i++)
	{
		G.V[i]=new LNode;
		G.V[i]->data=i;
		G.V[i]->next=NULL;
	}
  	while(arcnum--)
	{
      	int x,y;
		cin>>x>>y;
      	LinkList p=new LNode;
		p->data=y;
		p->next=G.V[x]->next;	
      	G.V[x]->next=p;	
        LinkList q=new LNode;
		q->data=x;
		q->next=G.V[y]->next;
		G.V[y]->next=q;
	}
  	return OK;
}
int InsertArc(ALGragh &G)
{
   	int a,b;
  	cin>>a>>b;
  	LinkList p=new LNode;
	p->data=b;
	p->next=G.V[a]->next;	
  	G.V[a]->next=p;
  	G.arcnum++;
    LinkList q=new LNode;
	q->data=a;
  	q->next=G.V[b]->next;
	G.V[b]->next=q;
 	G.arcnum++;
  	return OK;
}
int PrintGraph(ALGragh G)
{  
  	for(int j=1;j<=G.vexnum;j++)
    {
      LinkList p=G.V[j];
      while(p->next)
      {
          cout<<p->data<<" "; 
          p=p->next;
      }
      cout<<p->data<<endl; 
    }
    return OK;
}

第6关:基于邻接矩阵的新边的增加

任务描述

给定一个无向图,在此无向图中增加一条边。

编程要求

输入

多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有两个数字f和g,代表增加的边所依附的两个顶点。当n和m都等于0时,输入结束。

输出

每组数据输出n行。为增加边后的邻接矩阵。每两个数字之间用空格隔开。

测试说明

平台会对你编写的代码进行测试:

测试输入:

3 2

1 2

2 3

3 1

3 1

1 2

1 3

0 0

预期输出:

0 1 2 3

1 0 1 1

2 1 0 1

3 1 1 0

0 1 2 3

1 0 1 1

2 1 0 0

3 1 0 0

上答案:

#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MVNum 100     //最大顶点数
using namespace std;
typedef struct
{//图的邻接矩阵存储表示
	int vexs[MVNum];    //顶点表
	int arcs[MVNum][MVNum];    //邻接矩阵
	int vexnum,arcnum;     //图的当前点数和边数
}AMGragh;
int CreateUDN(AMGragh &G,int vexnum,int arcnum)
{//采用邻接矩阵表示法,创建无向网G
    G.vexnum=vexnum;
    G.arcnum=arcnum;
    if(G.vexnum>MVNum)
    return ERROR;
    for(int i=0;i<=G.vexnum;i++)
    G.arcs[0][i]=G.arcs[i][0]=i;
    for(int i=1;i<=G.vexnum;i++)
       for(int j=1;j<=G.vexnum;j++)
       G.arcs[i][j]=0;
       int h,k;
       for(int i=1;i<=G.arcnum;i++)
       {
           cin>>h>>k;
           G.arcs[h][k]=G.arcs[k][h]=1;
       }
       return OK;

}
int InsertArc(AMGragh &G)
{//在以邻接矩阵形式存储的无向图G上插入边
    int x,y;
    cin>>x>>y;
    G.arcs[x][y]=G.arcs[y][x]=1;
    G.arcnum++;
    return OK;

}
int OutputUDN(AMGragh G)
{//输出图G
    for(int i=0;i<=G.vexnum;i++)
{
    for(int j=0;j<G.vexnum;j++)
    cout<<G.arcs[i][j]<<" ";
    cout<<G.arcs[i][G.vexnum]<<endl;
}
return OK;
 
}

第7关:基于邻接表的边的删除

任务描述

给定一个无向图,在此无向图中删除一条边。

编程要求

输入

多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有两个数字f和g,代表删除的边所依附的两个顶点。当n和m都等于0时,输入结束。

输出

每组数据输出n行。为删除边后的邻接表。每两个数字之间用空格隔开。

测试说明

平台会对你编写的代码进行测试:

测试输入:

3 2

1 2

2 3

3 2

3 1

1 2

1 2

0 0

预期输出:

1 2

2 1

3

1

2

3

上答案:
 

#include<iostream>
using namespace std;
#define OK 0
#define ERROR -1
#define MAX 100
typedef struct LNode
{
	int data;
	struct LNode *next;
}LNode,*LinkList;
typedef struct
{
	int vexnum;
 	int arcnum;
	LinkList V[MAX];
}ALGragh;
int CreateUDG(ALGragh &G,int vexnum,int arcnum)
{
	G.vexnum=vexnum;
	G.arcnum=arcnum;
	if(G.vexnum>MAX)
    	return ERROR;
  	for(int j=1;j<=vexnum;j++)
	{
		G.V[j]=new LNode;
		G.V[j]->data=j;
		G.V[j]->next=NULL;
	}
  	while(arcnum--)
	{
      	int a,b;
		cin>>a>>b;
      	LinkList p=new LNode;
		p->data=b;
		p->next=G.V[a]->next;	
      	G.V[a]->next=p;	
        LinkList q=new LNode;
		q->data=a;
		q->next=G.V[b]->next;
		G.V[b]->next=q;
	}
  	return OK;
}
int DeleteArc(ALGragh &G)
{
	int i,j;
	cin>>i>>j;
	LinkList q;
  	q=G.V[i];
	while(q->next)
	{
		if(q->next->data==j)
		{
			q->next=q->next->next;
			G.arcnum--;
			break;
		}
		q=q->next;
	}
  	q=G.V[j];
	while(q->next)
	{
		if(q->next->data==i)
		{
			q->next=q->next->next;
			G.arcnum--;
			break;
		}
		q=q->next;
	}
	return OK;
}
int PrintGraph(ALGragh G)
{  
  	for(int j=1;j<=G.vexnum;j++)
    {
		LinkList p=G.V[j];
		while(p->next)
		{
			cout<<p->data<<" "; 
			p=p->next;
		}
		cout<<p->data<<endl; 
    }
    return OK;
}

第8关:基于邻接矩阵的边的删除

任务描述

给定一个无向图,在此无向图中删除一条边。

编程要求

输入

多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有两个数字f和g,代表删除的边所依附的两个顶点。当n和m都等于0时,输入结束。

输出

每组数据输出n行。为删除边后的邻接矩阵。每两个数字之间用空格隔开。

测试说明

平台会对你编写的代码进行测试:

测试输入:

3 2

1 2

2 3

3 2

3 1

1 2

1 2

0 0

预期输出:

0 1 2 3

1 0 1 0

2 1 0 0

3 0 0 0

0 1 2 3

1 0 0 0

2 0 0 0

3 0 0 0

上答案:
 

#include<iostream>
#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define MVNum 100     //最大顶点数
using namespace std;
typedef struct
{//图的邻接矩阵存储表示
	int vexs[MVNum];    //顶点表
	int arcs[MVNum][MVNum];    //邻接矩阵
	int vexnum,arcnum;     //图的当前点数和边数
}AMGragh;
int CreateUDN(AMGragh &G,int vexnum,int arcnum)
{//采用邻接矩阵表示法,创建无向网G
    G.vexnum=vexnum;
    G.arcnum=arcnum;
    if(G.vexnum>MVNum)
    return ERROR;
    for(int i=0;i<=G.vexnum;i++)
    G.arcs[0][i]=G.arcs[i][0]=i;
    for(int i=1;i<=G.vexnum;i++)
       for(int j=1;j<=G.vexnum;j++)
       G.arcs[i][j]=0;
       int h,k;
       for(int i=1;i<=G.arcnum;i++)
       {
           cin>>h>>k;
           G.arcs[h][k]=G.arcs[k][h]=1;
       }
       return OK;
	
}
int DeleteArc(AMGragh &G)
{//在以邻接矩阵形式存储的无向图G上删除边
    int x,y;
    cin>>x>>y;
    G.arcs[x][y]=G.arcs[y][x]=0;
    G.arcnum--;
    return OK;
  	
}
int OutputUDN(AMGragh G)
{//输出图G
    for(int i=0;i<=G.vexnum;i++)
{
    for(int j=0;j<G.vexnum;j++)
    cout<<G.arcs[i][j]<<" ";
    cout<<G.arcs[i][G.vexnum]<<endl;
}
return OK;
  
}

  • 24
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Galaxy*★

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值