【图论算法】图的基本概念及存储

~~国庆七天乐~~
 国庆三天乐
 在杨哥的悉心教导下,先学习了图的基本概念。

图的概念

点用边连接起来就做图,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;
}

不打了,下晚自习了

猜你喜欢

转载自www.cnblogs.com/mingklay/p/12811295.html