通用邻接表---vector实现

手写邻接表很麻烦。。。。所以写了一个邻接表模板,方便用

vector实现,使用时看看代码注释即可

#include <iostream>
#include <vector>
#include <cstdio>
#include <malloc.h>
#define INF 99999999;
#define max_point 1000000 ////定义总共的节点数目
using namespace std;

struct node
{
    int u, v, w;//分别代表一条边的起点,终点,权值
};

vector<node> mymap[max_point]; //储存图 

//插入一条边
void insertnode(int u, int v, int w, bool isdirection)//参数分别表示起点,终点,权值,还有是否为有向图
{
    node temp1 = {u, v, w};
    node temp2 = {v, u, w};

    if( isdirection )
    {
        mymap[u].push_back(temp1);
    }
    else
    {
        mymap[u].push_back(temp1);
        mymap[v].push_back(temp2);
    }
}

//删除一条边
//返回0表示删除失败
//返回大于0的整数表示删除了多少条边
int deletenode(int u, int v, bool isdirection)//参数分别表示起点,终点,权值,还有是否为有向图
{
    int flag = 0;
    if( isdirection )
    {
        for(vector<node>::iterator iter = mymap[u].begin(); iter != mymap[u].end(); )
        {
            if((*iter).v == v)
            {
                mymap[u].erase(iter);
                iter = mymap[u].begin();
                flag ++;
            }
            else
            {
                iter++;
            }
        }
    }
    else
    {
     for(vector<node>::iterator iter = mymap[u].begin(); iter != mymap[u].end(); )
        {
            if((*iter).v == v)
            {
                mymap[u].erase(iter);
                iter = mymap[u].begin();
                flag++;
            }
            else
            {
                iter++;
            }
        }

        for(vector<node>::iterator iter = mymap[v].begin(); iter != mymap[v].end(); )
        {
            if((*iter).v == u)
            {
                mymap[v].erase(iter);
                iter = mymap[v].begin();
                flag++;
            }
            else
            {
                iter++;
            }
        }
    }

    return flag;
}

//更新一条边  更新起点为u,终点为v的边权值为w
bool updatenode(int u, int v, int w, bool isdirection)
{
    bool flag = false;

    if( isdirection )
    {
        for(vector<node>::iterator iter = mymap[u].begin(); iter != mymap[u].end(); iter++)
        {
            if((*iter).v == v)
            {
                (*iter).w = w;
                flag = true;
                break;
            }
        }
    }
    else
    {
        for(vector<node>::iterator iter = mymap[u].begin(); iter != mymap[u].end(); iter++)
        {
            if((*iter).v == v)
            {
                (*iter).w = w;
                flag++;
                break;
            }
        }

        for(vector<node>::iterator iter = mymap[v].begin(); iter != mymap[v].end(); iter++)
        {
            if((*iter).v == u)
            {
                (*iter).w = w;
                flag++;
                break;
            }
        }
    }

    return flag;
}

//查找在u为起点的边中权值最大或者权值最小的顶点和权值
// choose等于1时表示查找最大值,等于2时表示查找最小值
//接收的结果要free!!!!!!!!!!!!!!!!!!
int * serachnode(int u, int choose)
{
    int * res = (int *) malloc(sizeof(int)*2);
    int max = -INF;
    int flag;
    int min = INF; 

    if(choose == 1)
    {
        for(vector<node>::iterator iter = mymap[u].begin(); iter != mymap[u].end(); iter++)
        {
            if( (*iter).w > max)
            {
                max = (*iter).w;
                flag = (*iter).v;
            }
        }
        res[0] = flag;
        res[1] = max;
    }
    else if(choose == 2)
    {
        for(vector<node>::iterator iter = mymap[u].begin(); iter != mymap[u].end(); iter++)
        {
            if( (*iter).w < min)
            {
                min = (*iter).w;
                flag = (*iter).v;
            }
        }
        res[0] = flag;
        res[1] = min;
    }
    return res;
}
时间: 2024-10-22 16:13:14

通用邻接表---vector实现的相关文章

图的连通分量(利用邻接表存储信息)

用vector实现邻接表 vector <int> G[100]; //表示有100个顶点的图的邻接表 G[u].push_back(v); //从顶点u 向顶点v 画边,即在相当于创建一个二维数组G[100][i] //搜索与顶点u 相邻的顶点v for( int i = 0; i < G[u].size(); i++) { int v = G[u][i]; ....... } 邻接表表示法的优点 只需与边数成正比的内存空间 邻接表表示法的缺点 (1)设u 的相邻顶点数量为n,那么在调

vector 邻接表的建立(好笨啊,才懂,可能太困了吧)。。

图的建立有两种,邻接矩阵和邻接表. 邻接矩阵适用于图较为密集,(稀疏图太浪费存储空间了),图如果较为稀疏,则使用邻接表为宜,dijkstra算法就是以邻接表为基础的. 有向无权图 #include<iostream> #include <vector> #include <algorithm> #include <queue> #include <stack> using namespace std; #define N 100000+5 vec

Hihocoder 之 #1097 : 最小生成树一&#183;Prim算法 (用vector二维 模拟邻接表,进行prim()生成树算法, *【模板】)

#1097 : 最小生成树一·Prim算法 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 最近,小Hi很喜欢玩的一款游戏模拟城市开放出了新Mod,在这个Mod中,玩家可以拥有不止一个城市了! 但是,问题也接踵而来——小Hi现在手上拥有N座城市,且已知这N座城市中任意两座城市之间建造道路所需要的费用,小Hi希望知道,最少花费多少就可以使得任意两座城市都可以通过所建造的道路互相到达(假设有A.B.C三座城市,只需要在AB之间和BC之间建造道路,那么AC之间也是可以通过

用邻接表或vector实现存边以及具体如何调用[模板]

存边: 对于指针实现的邻接表: struct edge{ int from,next,to,w; }E[maxn]; int head[maxn],tot=0;//head初始化为-1: void add(int x,int y,int z){ E[++tot].from=x;//头结点 E[tot].to=y;//连接的下一个结点 E[tot].w=z;//边权值 E[tot].next=head[x];//连接指针 head[x]=tot;//指针指向tot,即可通过head[x]为下标,运

邻接表的使用及和vector的比较

这几天碰到一些对建边要求挺高的题目.而vector不好建边,所以学习了邻接表.. 下面是我对邻接表的一些看法. 邻接表的储存方式 邻接表就是就是每个节点的一个链表,并且是头插法建的链表,这里我们首先用数组进行模拟..first [u],next[e]分别表示节点u的第一条边的编号,第e条边的下一条边的编号..则实现代码为: next[e]=head[u[e]]: head[u[e]]=e; 然后如果和结构体进行搭配使用会非常使用.. struct Edge { int to,val,next;

邻接表的使用及和vector的比較

这几天碰到一些对建边要求挺高的题目.而vector不好建边,所以学习了邻接表.. 以下是我对邻接表的一些看法. 邻接表的储存方式 邻接表就是就是每一个节点的一个链表,而且是头插法建的链表,这里我们首先用数组进行模拟..first [u],next[e]分别表示节点u的第一条边的编号,第e条边的下一条边的编号..则实现代码为: next[e]=head[u[e]]: head[u[e]]=e; 然后假设和结构体进行搭配使用会很使用.. struct Edge { int to,val,next;

STL_稀疏图,树_使用vector邻接表存储

本文出自:http://blog.csdn.net/svitter 分析:vector是STL模板中的容器.可以利用其性质来构建邻接表. 定义: #include <vector> #define MAXN 10000 //max n of a tree or graph //if is a tree, n / 2 is OK ; using namespace std; typedef vector<int> vint; vector <vint> G(MAXN);

利用C++ STL的vector模拟邻接表的代码

关于vector的介绍请看 https://www.cnblogs.com/zsq1993/p/5929806.html https://zh.cppreference.com/w/cpp/container/vector 下面是利用vector模拟邻接表的演示代码: 1 #include<iostream> 2 #include<stdio.h> 3 #include<vector> 4 using namespace std; 5 #define maxN 100

关于自动寻径和图、邻接表的学习和启发

以后的游戏中可能会用到人物的自动寻径,在网上看到一个非常不错的博文,特学习了一下,并转了过来为以后留着... 再次感谢 Siliphen的分享,本文转载自 http://blog.csdn.net/stevenkylelee/article/details/38408253 本文乃Siliphen原创,转载请注明出处:http://blog.csdn.net/stevenkylelee 本文的实现使用的环境是:Cocos2d-x 3.2,VS2013 本文,我们最终实现的地图行走效果如下2图: