#include <iostream> #include <ctime> #include <string> #include <vector> using namespace std; #define LL long long const int MAX_SCALE=10; class picM{ vector<vector<int>> nearMatrix; vector<int> OD,ID; int size; public: picM(){ size=0; for(int i=0;i<MAX_SCALE;i++){ vector<int> v(MAX_SCALE,0); nearMatrix.push_back(v); } } void resize(int n){ size=n; for(int i=0;i<n;i++){ vector<int> v(n,0); nearMatrix.push_back(v); } } void add(int a,int b,int c){ if(a>size) size=a; if(b>size) size=b; nearMatrix[a-1][b-1]=c; } void printMatrix(){ cout<<"邻接矩阵如下:"<<endl; for(int i=0;i<size+1;i++){ if(i==0){ for(int j=0;j<size+1;j++){ if(j==0){ cout<<" "; }else{ cout<<" "; cout<<j; if(j<10) cout<<" "; } } }else{ for(int j=0;j<size+1;j++){ if(j==0){ cout<<i; if(i<10) cout<<" "; }else{ cout<<" "; cout<<nearMatrix[i-1][j-1]; if(nearMatrix[i-1][j-1]<10) cout<<" "; } } } cout<<endl; } } void calNum(){ //计算度数并输出,默认为无向权重图 cout<<"结点出度如下:"<<endl; OD.resize(size); ID.resize(size); for(int i=0;i<size;i++){ OD[i]=0; ID[i]=0; for(int j=0;j<size;j++){ OD[i]+=nearMatrix[i][j]; ID[i]+=nearMatrix[j][i]; } cout<<"结点"<<i+1<<"的出度为:"<<OD[i]<<",入度为:"<<ID[i]<<endl; } return ; } }; int main(){ picM p; int n,a,b,c,m; cout<<"请输入顶点的个数:"; cin>>m; p.resize(m); cout<<"请输入边的数量:"; cin>>n; for(int i=0;i<n;i++){ cin>>a>>b>>c; p.add(a,b,c); } p.printMatrix(); p.calNum(); return 0; }
很简单的ADT编写与功能实现,默认为有向权重图,注意出度与入度的区分即可,整体逻辑清晰也很简单;值得注意的是矩阵的输出格式化,考虑到两位数字,必须设置好输出的格式(占位两格不足补齐,间隔都为一格),才能使关系矩阵被有序的输出。若是无向矩阵,添加边信息时双向的矩阵内容都要填补。