无向图两顶点的连通性及删除边
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
using namespace std;
#define MAX_VERTEX_NUM 20
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define INIT_SIZE 50
#define INCREMENT 10
typedef enum{ DG, DN, UDG, UDN } GraphKind;
typedef int status;
typedef int ElemType;
typedef struct ArcNode // 弧结点
{ int adjvex; //邻接点域,存放与Vi邻接的点在表头数组中的位置struct ArcNode *nextarc; //链域,指示依附于vi的下一条边或弧的结点,}ArcNode;
typedef struct VNode //表头结点
{ char vexdata; //存放顶点信息
struct ArcNode *firstarc; //指示第一个邻接点
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct { //图的结构定义
AdjList vertices; //顶点向量
int vexnum, arcnum;
// GraphKind kind=0; // 图的种类标志
} MGraph;
int LocateVex(MGraph &G,char v){
for(int i=0;i if(G.vertices[i].vexdata==v) return i; } return -1; } void CreateGraph(MGraph &G) {// 生成图G的存储结构-邻接表无向图 cout<<"输入顶点数、边数:"< cin >> G.vexnum >> G.arcnum ; // 输入顶点数、边数和图类 // G.vexnum=5;G.arcnum=7; cout<<"输入顶点:"< for (int i=0; i // 构造顶点数组: cin>> G.vertices[i].vexdata; // 输入顶点 G.vertices[i].firstarc = NULL; } cout<<"输入各边:"< for (int k=0; k { char sv,tv; cin>>sv>> tv; // 输入一条边(弧)的始点和终点 i = LocateVex(G, sv); int j = LocateVex(G, tv);// 确定sv和tv在G中位置,即顶点在G.vertices中的序号 ArcNode * pi = new ArcNode; ArcNode * pj = new ArcNode; if (!pi) exit(-1); if (!pj) exit(-1); pi -> adjvex = j; // 对弧结点赋邻接点"位置 pi -> nextarc = G.vertices[i].firstarc;//头插法,将tv结点插入到第i个单链表中 G.vertices[i].firstarc = pi; // 插入链表G.vertices[i] pj -> adjvex = i; pj -> nextarc = G.vertices[j].firstarc; G.vertices[j].firstarc = pj; } cout<<"构造成功!"< } //删除连接x y的边 status Deleteside(MGraph &G,int x,int y) { ArcNode * p=G.vertices[x].firstarc; ArcNode * q=G.vertices[x].firstarc; while(p&&p->adjvex!=y) { q=p; p=p->nextarc; } if(!p) return 0; if (p==G.vertices[x].firstarc) { G.vertices[x].firstarc=p->nextarc; } else q->nextarc=p->nextarc; delete p; p=G.vertices[y].firstarc; q=G.vertices[y].firstarc; while(p&&p->adjvex!=x) { q=p; p=p->nextarc; } if(!p) return 0; if (p==G.vertices[y].firstarc) { G.vertices[y].firstarc=p->nextarc; } else q->nextarc=p->nextarc; delete p; return 1; } typedef struct Node { int data; struct Node *next; }QNode,*QueuePtr; typedef struct { QueuePtr front; QueuePtr rear; }LinkQueue; bool visited[10]; ArcNode *nextnode=NULL;//全局变量