#include<bits/stdc++.h>
using namespace std;
//邻接矩阵的输入以及输出
/*
输入格式如下:
首先是顶点数和边数
然后是顶点的值(数据类型为string)
然后是边数行,分别输入边的两个顶点名称以及其权值
示例如下:
6 6
p1 p2 p3 p4 p5 p6
p1 p2 5
p2 p4 10
p1 p3 7
p5 p1 12
p4 p5 9
p4 p3 2
*/
#define MAX_NUM 114514 //寓意:逸一时,误一世!
typedef string VerticesType;//顶点数据的类型
typedef struct AdjacentMatrix{
int vexnum,arcnum;//顶点数和边数
VerticesType Vertices[100];//顶点
int Edge[100][100];//邻接矩阵
}AMGraph;
void create_AMGraph(AMGraph &G){
VerticesType x,y;
int x1,y1;
cin>>G.vexnum>>G.arcnum;//输入顶点数和边数
for(int i=0;i<G.vexnum;++i){
cin>>G.Vertices[i];
}
for(int i=0;i<G.vexnum;++i){
for(int j=0;j<G.vexnum;++j){
G.Edge[i][j]=MAX_NUM;//先给邻接矩阵赋初值
}
}
for(int i=0;i<G.arcnum;++i){
//如果直接输入顶点的名称,还需要找到这两个顶点的下标
cin>>x>>y;//输入要赋权的边的位置
for(int j=0;j<G.vexnum;++j){//采用了最简单但最慢的方法,遍历
//主要我觉得边数上限也才设置为了100,再循环一遍也问题不大
if(G.Vertices[j]==x){
x1=j;
}
else if(G.Vertices[j]==y){
y1=j;
}
}
cin>>G.Edge[x1][y1];
}
}
void push_AMGraph(AMGraph &G){//打印一遍邻接矩阵检查
for(int i=0;i<G.vexnum;++i){
cout<<G.Vertices[i]<<" ";}
cout<<endl;
for(int i=0;i<G.vexnum;++i){
for(int j=0;j<G.vexnum;++j){
cout<<fixed<<setw(6)<<G.Edge[i][j]<<" ";//为了美观,左边补上空格
}
cout<<endl;
}
}
int main(){
AMGraph tu;
create_AMGraph(tu);
push_AMGraph(tu);
return 0;
}
主要参考:严蔚敏的《数据结构》。说实话我还是看不太懂。
只不过呢,现在都大二下了,大一下的数据结构还是一窍不通(认真),今天晚上花了一个多小时才写完以上这段,实在是服了我自己了。
这几天真的太焦虑了,哎呀呀,真是无可奈何呢。