图的存储结构

1.邻接矩阵
2.前向星       
//所需要的数据结构 
int head[maxn];		//下标表示起点, 存储起点的第一条边的位置
struct EdgeNode
{
    int from;		//起点
    int to;		//终点
    int w;		//权值
};
EdgeNode Edge[maxn];

//比较函数 
bool cmp(EdgeNode a, EdgeNode b)
{
    if(a.from == b.from && a.to == b.to)    return a.w < b.w;
    if(a.from == b.from)    return a.to < b.to;
    return a.from < b.from;
}

//读入数据 
cin>>n>>m;
for(int i=1; i<=m; i++) cin>>Edge[i].from>>Edge[i].to>>Edge[i].w;
sort(Edge+1, Edge+1+m, cmp);
memset(head, -1, sizeof(head));
head[Edge[1].from]=1;
for(int i=2; i<=m; i++)
    if(Edge[i].from != Edge[i-1].from)  head[Edge[i].from] = i; 	// 确定各起点的第一条边的位置

//遍历代码 
for(int i=1; i<=n; i++)
    for(int k=head[i]; Edge[k].from==i && k<=m; k++)
        cout<<Edge[k].from<<' '<<Edge[k].to<<' '<<Edge[k].w<<endl;  
3.邻接表
注意:n个顶点e条边的无向图的邻接表表示中有n个顶点表结点和2e个边表结点。(换句话说,每条边(i,j)在邻接表 中出现两次:一次在关于i的邻接表中,另一次在关于j的邻接表中)
struct EdgeNode //邻接表节点
{
    int to;
    int w;
    Edgenode *next;//指向下一条边的指针
};
struct VNode//起点表节点
{
    int from;
    EdgeNode *first//邻接表头指针
}
VNode Adjlist[1000]; //整个图的邻接表

cin>>i>>j>>w;
EdgeNode *p = new EdgeNode();  // 新建一条边
p->to = j;
p->w = w;
p->next = Adjlist[i].first; //将新节点加到链表头部
Adjlist[i].first = p;

//遍历代码
for(int i=1; i<=n; i++) //每个节点都当作头节点扫过去
 for(Edgenode *k = Adjlist[i].first; k!=null; k=k->next)
    cout << i << ' ' << k->to << ' ' << k->w << endl;

4.邻接表(vector模拟链表实现)
struct EdgeNode //边表节点类型
{
    int to; //定点的序号
    int w;  //权值
};
vector<EdgeNode> map[maxn];

//信息存储
EdgeNode e;
cin>>i>>j>>w;
e.to=j;
e.w=w;
map[i].push_back(e);

//遍历代码
for(int i=1; i<=n; i++)
    for(vector<EdgeNode>::iterator k=map[i].begin(); k!=map[i].end; k++)
    {
        node t=*k;
        cout<<i<<' '<<t.to<<' '<< t.w<< endl;
  
5.链式前向星
采用数组模拟链表的方式实现邻接表的功能,并且使用很少的额外空间
 
 
int head[n];
strcut EdgeNode
{
    int to;
    int w;
    int next;
};
EdgeNode Edges[m];

cin>>i>>j>>w;
//k表示当前输入第k条边
Edges[k].to=j;
Edges[k].w=w;
Edges[k].next=head[i];
head[i]=k;  //head数组表示第i个点的第一条边的位置

//遍历代码
for(int i=1; i<=n; i++)
    for(int k=head[i]; k!=-1; k=Edges[k].next)
    cout<<i<<" "<<Edges[k].to<<' '<<Edges[k].w<<endl;


                
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值