【图论算法】图的基本概念及存储
在杨哥的悉心教导下,先学习了图的基本概念。
图的概念
点用边连接起来就做图,graph=(V,E)v代表结点,e代表边
权值w:边的长度,依各题情况而定
连通:从u到v存在一条通路,则称u,v是连通的
回路:起点即是终点的路,又叫环
完全图:任意两个结点都被边直接相连(可用于判断数据范围)
稠密图:边数接近完全图的图
稀疏图:边数远远少于完全图的图
无向图
图一是个无向图,无向图中与结点相连的边的数目叫做结点的度
对于n阶无向完全图,有n(n-1)/2条边
有向图
图二是个有向图,有向图中以该结点为终点的边的数目叫做结点的入度,以该结点为起点的边的数目叫做结点的出度
对于n阶有向完全图,有n(n-1)条边
二维数组存储
int map[max][max];
map[i][j]=当i和j相连时是权值(true),否则是无穷大或小(false)
邻接数组初始化:memset
int型:极大值:memset(map,0x7f,sizeof(map));
极小值:memset(map,0xaf,sizeof(map));
0:memset(map,0,sizeof(map));
邻接表存储
实际上使用链表完成储存,也可用数组模拟
代码如下:
#include<bits/stdc++.h> using namespace std; int n,m; struct edge{int v,w,next;}e[101]; int head[101],k=1; int h[101]; void addedge(int u,int v,int w)//储存邻接表,u 边的起点,v 边的终点 { e[k].next=head[u];//记录该节点的最后一条边 e[k].v =v;//记录这条边的终点 e[k].w =w;//记录这条边的权值 head[u]=k++;//刷新head[u]的值 ++h[v];//记录v的入度 } int main() { cin>>n>>m; for(int i=1;i<=m;i++) { int u,v,w; cin>>u>>v>>w; addedge(u,v,w); } // int z; // cin>>z; // int q=head[z]; // while(q) // { // cout<<e[q].v<<" "; // q=e[q].next; // } // 输入起始节点 输出该节点的终点 return 0; }
不打了,下晚自习了