基于邻接矩阵的顶点的删除
描述
给定一个无向图,在此无向图中删除一个顶点。
输入
多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有一个数字f,代表删除的顶点编号。当n和m都等于0时,输入结束。
输出
每组数据输出n-1行。为删除顶点后的邻接矩阵。每两个数字之间用空格隔开。
输入样例 1
3 2 1 2 2 3 1 2 1 1 2 2 0 0
输出样例 1
0 2 3 2 0 1 3 1 0 0 1 1 0
#include<iostream>
using namespace std;
#define Max 100
typedef struct {
char vex[Max];
int edge[Max][Max];
int vexnum, arcnum;
}MGraph;
void Create(MGraph& g, int n, int m) {
g.vexnum = n;
g.arcnum = m;
for (int i = 0; i <= g.vexnum; i++) {
g.edge[i][0] = i;
g.edge[0][i] = i;
}
for (int i = 1; i <= g.vexnum; i++) {
for (int j = 1; j <= g.vexnum; j++) {
g.edge[i][j] = 0;
}
}
int x, y;
for (int i = 1; i <= g.arcnum; i++) {
cin >> x >> y;
g.edge[x][y] = 1;
g.edge[y][x] = 1;
}
}
void Delete(MGraph& g,int x) {
for (int i = 0; i <= g.vexnum; i++) {
for (int j = x; j < g.vexnum; j++) {
g.edge[i][j] = g.edge[i][j + 1];
}
}
for (int i = x; i < g.vexnum; i++) {
for (int j = 0; j <= g.vexnum; j++) {
g.edge[i][j] = g.edge[i + 1][j];
}
}
g.vexnum = g.vexnum-1;
}
void Output(MGraph g) {
for (int i = 0; i <= g.vexnum; i++) {
for (int j = 0; j < g.vexnum; j++) {
cout << g.edge[i][j] << " ";
}
cout << g.edge[i][g.vexnum] << endl;
}
}
int main() {
int n, m;
while (cin >> n >> m && n != 0 && m != 0) {
MGraph g;
Create(g, n, m);
int x;
cin >> x;
Delete(g, x);
Output(g);
}
}