#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;
}
int CreateUDN(AMGraph &G)
{
int i,j,k;
G.vexnum++;
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;//不重复则录入
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;
vn++;
}
i=LocateVex(G,v1);
j=LocateVex(G,v2);
G.arcs[i][j]=1;
// cout<<"已经写入"<<v1<<" "<<v2<<endl;
G.arcs[j][i]=G.arcs[i][j];
// cout<<"当前k:"<<k<<":"<<G.vexnum<<endl;
}
cin>>G.vexs[vn];//录入新顶点
return 1;
}
void CA(AMGraph &G)
{//输出矩阵
int i;int j;
//输出表头
cout<<0<<" ";
for(int i=0,j;i<G.vexnum;i++)
{
cout<<G.vexs[i];
if(i!=G.vexnum-1)cout<<" ";
}
cout<<endl;
for(i=0;i<G.vexnum;i++)
{
//输出表头
cout<<G.vexs[i];
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);
//cout<<"--------------"<<endl;
}
}
描述
给定一个无向图,在此无向图中增加一个新顶点。
输入
多组数据,每组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 4 2 1 1 2 4 0 0
输出样例 1
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
原博地址
https://blog.csdn.net/weixin_43673589