图的存储

图中任意两点都有路径连接的叫连通图,没有圈的连通图叫数,

有向图的边数等于顶点数-1,无向图的顶点数等于边数。有向图分出度(这个顶点出去的边数)和入度(进来的边数)

用程序表示图的方法有两种,邻接矩阵和邻接表;

邻接表分两种:

一种使用vector

struct edge{
    int to,cost;
};
vector<edge>G[MAXV];


struct edge{
    int to,cost;
    edge(int _to,int _cost):to(_to),cost(_cost){}
};
vector<edge>G[MAXV];

int main()
{
    int V,E;
    scanf("%d%d",&V,&E);
    for(int i=0;i<E;i++){
        int s,t,w;
        scanf("%d%d%d",&s,&t,&w);
        G[s].push_back(edge(t,w));
        G[t].push_back(edge(s,w));
    }
}

 

另一种是用链表的思想

 

#include<iostream>
#include<cstdio>
#include<cstring>

const int MAXE=1e3+50;
const int MAXV=1e2+50;

struct edge{
    int u,v,cost,next;
};
edge edges[MAXE];

int head[MAXV],tot;

void add_edge(int u,int v,int cost)
{
    edges[tot].u=u;
    edges[tot].v=v;
    edges[tot].cost=cost;
    edges[tot].next=head[u];
    head[u]=tot++;
}

int main()
{
    int V,E;
    scanf("%d%d",&V,&E);
    memset(head,-1,sizeof(head));
    for(int i=1;i<=E;i++){
        int s,t,cost;
        scanf("%d%d%d",&s,&t,&cost);
        add_edge(s,t,cost);
        add_edge(t,s,cost);
    }
    for(int i=head[1];~i;i=edges[i].next){
        printf("%d %d %d\n",edges[i].u,edges[i].v,edges[i].cost);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值