针对邻接矩阵实现的图的部分操作
#include<iostream>
#define MAXVEX 10
#define INFINITY 65656
using namespace std;
typedef int EdgeType;
typedef int VertexType;
int visited[MAXVEX];
typedef struct
{
VertexType vexs[MAXVEX];
EdgeType arc[MAXVEX][MAXVEX];
EdgeType weight[MAXVEX];
int numNodes;
int numEdges;
int flag;
} MGraph;
//无权图
/*
void CreateUGraph(MGraph *Gp)
{
int i,j,k;
cin>>Gp->numNodes;
for(i=0; i<Gp->numNodes; i++) //输入顶点
cin>> Gp->vexs[i];
for(i=0; i<Gp->numNodes; i++) //初始化邻接矩阵
{
for(j=0; j<Gp->numNodes; j++)
{
if(i==j)
Gp->arc[i][j]=0;//顶点没有到自己的边
else
Gp->arc[i][j]=0;//初始化边为无穷
}
}
cin>>Gp->numEdges;
for(k=0; k<Gp->numEdges; k++)
{
cin>>i>>j;
Gp->arc[i][j]=1;
Gp->arc[j][i]=Gp->arc[i][j];//对称矩阵
}
}
*/
//有向有权图
void CreateDGraph(MGraph *Gp)
{
int i,j,k;
cin>>Gp->numNodes;
for(i=0; i<Gp->numNodes; i++) //输入顶点
cin>> Gp->vexs[i];
cin>>Gp->flag;
for(i=0; i<Gp->numNodes; i++) //初始化邻接矩阵
{
for(j=0; j<Gp->numNodes; j++)
{
if(i==j)
Gp->arc[i][j]=Gp->flag;//顶点没有到自己的边
else
Gp->arc[i][j]=Gp->flag;//初始化边为无穷
}
}
cin>>Gp->numEdges;
for(k=0; k<Gp->numEdges; k++)
{
cin>>i>>j;
Gp->arc[i][j]=1;
}
for(k=0;k<Gp->numEdges; k++)
{
cin>>Gp->weight[k];
}
k=0;
for(i=0; i<Gp->numNodes; i++) //邻接矩阵赋予权值
{
for(j=0; j<Gp->numNodes; j++)
{
if(Gp->arc[i][j]==1)
{
Gp->arc[i][j]=Gp->weight[k];
++k;
}
}
}
}
//无向有权图
void CreateUDGraph(MGraph *Gp)
{
int i,j,k;
cin>>Gp->numNodes;
for(i=0; i<Gp->numNodes; i++) //输入顶点
cin>> Gp->vexs[i];
cin>>Gp->flag;
for(i=0; i<Gp->numNodes; i++) //初始化邻接矩阵
{
for(j=0; j<Gp->numNodes; j++)
{
if(i==j)
Gp->arc[i][j]=Gp->flag;//顶点没有到自己的边
else
Gp->arc[i][j]=Gp->flag;//初始化边为无穷
}
}
cin>>Gp->numEdges;
for(k=0; k<Gp->numEdges; k++)
{
cin>>i>>j;
Gp->arc[i][j]=1;
Gp->arc[j][i]=1;
}
for(k=0;k<Gp->numEdges; k++)
{
cin>>Gp->weight[k];
}
k=0;
for(i=0; i<Gp->numNodes; i++) //邻接矩阵赋予权值
{
for(j=0; j<Gp->numNodes; j++)
{
if(Gp->arc[i][j]==1)
{
Gp->arc[i][j]=Gp->weight[k];
Gp->arc[j][i]=Gp->weight[k];
++k;
}
}
}
}
/*
//顶点定位
int location_point(MGraph *Gp,char x)
{
for(int i=0;i<Gp->numNodes;i++)
{
if(x==Gp->vexs[i])
{
return i;
}
}
return -1;
}
//删除顶点(结点集)
void deletepoint_vexs(MGraph *Gp,int a)
{
for(int i=a;i<Gp->numNodes;i++)
{
Gp->vexs[i]=Gp->vexs[i+1];
}
Gp->numNodes--;
}
//删除顶点(邻接矩阵)
void deletepoint_arc(MGraph *Gp,int a)
{
for(int i = 0;i < Gp->numNodes;i++)
{
for(int j = 0;j < Gp->numNodes;j++)
{
if(i>a&&j>a)
{
Gp->arc[i-1][j-1] = Gp->arc[i][j];
}
else if(i > a)
{
Gp->arc[i-1][j] = Gp->arc[i][j];
}
else if(j > a)
{
Gp->arc[i][j-1] = Gp->arc[i][j];
}
}
}
--Gp->numNodes;
}
*/
//输出邻接矩阵
void print_arc(MGraph *Gp)
{
for(int i=0; i<Gp->numNodes; i++)
{
for(int j=0; j<Gp->numNodes; j++)
{
cout<<Gp->arc[i][j]<<" ";
if(j==Gp->numNodes-1&&i!=Gp->numNodes-1)
{
cout<<endl;
}
}
}
}
//输出结点集
void print_point(MGraph *Gp)
{
for(int i=0; i<Gp->numNodes; i++)
{
if(i==Gp->numNodes-1)
{
cout<<Gp->vexs[i]<<endl;
}
else
{
cout<<Gp->vexs[i]<<" ";
}
}
}
/*
//求出度
int get_chudu(MGraph *Gp,int x)
{
int outnum=0;
if(x>Gp->numNodes||x<0)
{
cout<<"-1"<<endl;
}
else
{
int flag=0;
for(int j=0; j<Gp->numNodes; j++)
{
if(Gp->arc[x][j]==1)
{
++outnum;
flag++;
}
}
if(flag==0)
{
cout<<"-1"<<endl;
}
else
{
cout<<outnum<<endl;
}
}
return outnum;
}
//求下一个邻接点的位序
int get_nextpoint_num(MGraph *Gp,int first,int point)
{
if(point>=Gp->numNodes||point<0)
{
return -1;
}
else if(first>=Gp->numNodes||first<0)
{
return -1;
}
else
{
int a=0;
int flag=0;
for(int i=point+1;i<Gp->numNodes;i++)
{
if(Gp->arc[first][i]==1)
{
a=i;
flag=1;
break;
}
}
if(flag==1)
{
return a;
}
else
{
return -1;
}
}
}
//求第一个邻接点的位序
int get_firstpoint_num(MGraph *Gp,int point)
{
if(point>=Gp->numNodes||point<0)
{
return -1;
}
else
{
int a=0;
int flag=0;
for(int i=0;i<Gp->numNodes;i++)
{
if(Gp->arc[point][i]==1)
{
a=i;
flag=1;
break;
}
}
if(flag==1)
{
return a;
}
else
{
return -1;
}
}
}
//深度优先遍历DFS递归
void DFS(MGraph *Gp,int i)
{
int j;
visited[i]=true;
cout<<Gp->vexs[i];
for(j=0;j<Gp->numNodes;j++)
{
if(Gp->arc[i][j]==1&&!visited[j])
{
cout<<"->";
DFS(Gp,j);
}
}
}
//深度优先遍历DFS
void DFStraverse(MGraph *Gp,int first)
{
int i;
for(i=first;i<Gp->numNodes;i++)
{
visited[i]=false;
}
for(i=first;i<Gp->numNodes;i++)
{
if(!visited[i])
{
DFS(Gp,i);
}
}
}
//指定顶点的位序
int get_point_num(MGraph *Gp,char point)
{
for(int i=0;i<Gp->numNodes;i++)
{
if(Gp->vexs[i]==point)
{
return i;
}
}
return -1;
}
*/
int main()
{
MGraph MG;
string s;
cin>>s;
if(s=="DG"||s=="DN")
{
CreateDGraph(&MG);
cout<<s<<endl;
print_point(&MG);
cout<<endl;
print_arc(&MG);
cout<<endl;
}
else if(s=="UDG"||s=="UDN")
{
CreateUDGraph(&MG);
cout<<s<<endl;
print_point(&MG);
cout<<endl;
print_arc(&MG);
cout<<endl;
}
return 0;
}