描述
给定一个无向图,在此无向图中增加一条边。
输入
多组数据,每组m+2行。第一行有两个数字n和m,代表有n个顶点和m条边。顶点编号为1到n。第二行到第m+1行每行有两个数字h和k,代表边依附的两个顶点。第m+2行有两个数字f和g,代表删除的边所依附的两个顶点。当n和m都等于0时,输入结束。
输出
每组数据输出n行。为删除边后的邻接矩阵。每两个数字之间用空格隔开。
输入样例 1
3 2
1 2
2 3
3 2
3 1
1 2
1 2
0 0
输出样例 1
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>
#include <cstring>
#define MVNum 100
using namespace std;
typedef struct
{
char vexs[MVNum];//点集
int arcs[MVNum][MVNum];//边的邻接矩阵
int vexnum,arcnum;//点数&边数
}AMGraph;
int LocateVex(AMGraph G,char u)
{//存在则返回u在顶点表中的下标;否则返回-1
int i;
for(i=0;i<G.vexnum;++i)
if(u==G.vexs[i])
return i;
return -1;
}
void InitAM(AMGraph &G)
{//初始化图
memset(G.vexs,0,sizeof(G.vexs));//初始化顶点集
memset(G.arcs,0,sizeof(G.arcs));//初始化边的邻接矩阵
return;
}
void Del(AMGraph &G)
{
char vd;
cin>>vd;
//cout<<"待删除结点:"<<vd<<"位置:"<<LocateVex(G,vd)<<endl;
int position=LocateVex(G,vd);
//先调整关系矩阵
for(int i = 0;i < G.vexnum;i++)
{
for(int j = 0;j < G.vexnum;j++) //将关系矩阵向内紧缩(顶点将要移动)
{
if(i > position && j > position)
G.arcs[i-1][j-1] = G.arcs[i][j];
else if(i > position)
G.arcs[i-1][j] = G.arcs[i][j];
else if(j > position)
G.arcs[i][j-1] = G.arcs[i][j];
}
for(int i = 0;i < G.vexnum;i++) //紧缩以后,最后一个顶点已经没有意义了(移到倒数第二个了)
{
G.arcs[G.vexnum][i] = 0;
G.arcs[i][G.vexnum] = 0;
}
}
for(int i=LocateVex(G,vd);i<G.vexnum;i++)
{
G.vexs[i]=G.vexs[i+1];
}
G.vexnum--;
//cout<<"点集:";
// for(int i=0;i<G.vexnum;i++)
// cout<<G.vexs[i];
// cout<<endl;
return;
}
int CreateUDN(AMGraph &G)
{
int i,j,k;
int vn=0;//已录入顶点数
for(k=0;k<G.arcnum;k++)//将边录入邻接矩阵,顺便将顶点录入
{
char v1,v2;
cin>>v1>>v2;//边的端点
int tag=0;
//先将顶点录入点集
for(i=0;i<G.vexnum;i++)//比较当前待录入顶点与点集中的点,不重复则录入
{
if(v1==G.vexs[i])tag=1;
}// 要遍历整个点集才知道有没有重复,设置一个标志位tag
if(tag==0)
{
G.vexs[vn]=v1;//不重复则录入
// cout<<v1<<"已录入点集"<<endl;
vn++;//已录入顶点数加1
}
tag=0;//标志位归零
for(i=0;i<G.vexnum;i++)
{
if(v2==G.vexs[i])tag=1;
}
if(tag==0)
{
G.vexs[vn]=v2;
//cout<<v2<<"已录入点集"<<endl;
vn++;
}
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j]=1;
G.arcs[j][i]=G.arcs[i][j];
}
return 1;
}
void DelArc(AMGraph &G)
{
char v1,v2;
cin>>v1>>v2;
int i=LocateVex(G,v1);
int j=LocateVex(G,v2);
G.arcs[i][j]=0;
G.arcs[j][i]=G.arcs[i][j];
G.arcnum--;
return;
}
void CA(AMGraph &G)
{//输出矩阵
int i;int j;
//输出表头
cout<<0<<" ";
for(int i=0,j;i<G.vexnum;i++)
{
cout<<i+1;
if(i!=G.vexnum-1)cout<<" ";
}
cout<<endl;
for(i=0;i<G.vexnum;i++)
{
//输出表头
cout<<i+1;
if(i!=G.vexnum)cout<<" ";
//输出内容
for(j=0;j<G.vexnum;j++)
{
cout<<G.arcs[i][j];
if(j!=G.vexnum-1)cout<<" ";
}
cout<<endl;
}
}
int main()
{
while(1)
{
AMGraph G;
InitAM(G);
cin>>G.vexnum>>G.arcnum;
if(G.vexnum==0&&G.arcnum==0)break;
CreateUDN(G);
// CA(G);
// while(G.vexnum)
// {
// cout<<"-------"<<G.vexnum<<"-------"<<endl;
DelArc(G);
CA(G);
// }
}
}