图的表示(建立)有两种方法:
①邻接矩阵:A(i,j)=1表示i,j存在一条边,空间复杂度O(n^2),稠密图
②邻接表:只记录存在的边,Vector+List的数据结构,稀疏图
邻接矩阵的图建立这里不做赘述,接下来我们看一下邻接表的图建立:
<1>有向图
注意理解头插入节点的过程
int n,m;//n表示城镇个数,m表示道路条数</span> struct LinkNode//列表节点 { int vex; //邻接的结点在数组中的编号 LinkNode* next; }; struct Node//邻接表 { int data; LinkNode* head;//列表头节点 } Adj[maxn]; //生成无向图(邻接表实现)Vector+List void createLink(){ LinkNode *ptr1,*ptr2;//首先声明两个空节点 for(int i=1;i<=n;i++) Adj[i].head=NULL; for(int i=1;i<=m;i++){ ptr1=new LinkNode; scanf("%d",&ptr1->vex); //头插入建表,非常关键,注意理解head的位置 ptr2=new LinkNode; scanf("%d",&ptr2->vex); //有向图头插入建立列表过程,只需一次 ptr2->next=Adj[ptr1->vex].head; Adj[ptr1->vex].head=ptr2; } } int main() { //freopen("input.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF){ //基于邻接表,速度快 createLink(); } return 0; }
<2>无向图
基于有向图,插入两次即可
int n,m;//n表示城镇个数,m表示道路条数 struct LinkNode//列表节点 { int vex; //邻接的结点在数组中的编号 LinkNode* next; }; struct Node//邻接表 { int data; LinkNode* head;//列表头节点 } Adj[maxn]; //生成无向图(邻接表实现)Vector+List void createLink(){ LinkNode *ptr1,*ptr2;//首先声明两个空节点 for(int i=1;i<=n;i++) Adj[i].head=NULL; for(int i=1;i<=m;i++){ ptr1=new LinkNode; scanf("%d",&ptr1->vex); //头插入建表,非常关键,注意理解head的位置 ptr2=new LinkNode; scanf("%d",&ptr2->vex); ptr2->next=Adj[ptr1->vex].head; Adj[ptr1->vex].head=ptr2; //无向图邻接表建立 ptr1->next=Adj[ptr2->vex].head; Adj[ptr2->vex].head=ptr1; } } int main() { //freopen("input.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF){ //基于邻接表,速度快 createLink(); } return 0; }
时间: 2024-10-25 21:33:51