//-------------图的邻接表存储表示-------------
#include<iostream>
using namespace std;
#define MVNum 100 //最大顶点数
typedef struct ArcNode //边结点
{
int adjvex; //该边指向的顶点的位置
struct ArcNode* nextarc; //指向下一条边的指针
}ArcNode;
typedef struct VNode //顶点信息
{
int data;
ArcNode* firstarc; //指向第一条依附该顶点的边的指针
}VNode,AdjList[MVNum]; //AdjList表示邻接表类型
typedef struct //邻接表
{
AdjList vertices;
int vexnum, arcnum; //图的当前边数和顶点数
}ALGraph;
void CreateUDG(ALGraph& G)
{
cin >> G.vexnum>>G.arcnum;
for (int i = 0; i < G.vexnum; ++i)
{
cin >> G.vertices[i].data;
G.vertices[i].firstarc = NULL;//初始化表头节点的指针域为NULL
}
for (int k = 0; k < G.arcnum; ++k)
{
int v1, v2;
cin >> v1 >> v2;
//i=LocateVex(G,v1);j=LocateVex(G,v2);//确定v1和v2在G中的位置,即顶点在G。vertices中的序号
ArcNode* p1 = new ArcNode();//一个新的边结点
//接下来的部分i代替v1,j代替v2
p1->adjvex = v2;//邻接点序号为j
p1->nextarc = G.vertices[v1].firstarc;
G.vertices[v1].firstarc = p1;//将新结点插入顶点vi的边表头部
ArcNode* p2 = new ArcNode();//一个新的边结点
//接下来的部分i代替v1,j代替v2
p2->adjvex = v1;//邻接点序号为v1
p2->nextarc = G.vertices[v2].firstarc;
G.vertices[v2].firstarc = p2;//将新结点插入顶点vj的边表头部
}
}