图的存储与遍历

第一行照例留给本鸽子精咕咕咕。
第二行感谢耐心给我讲图到很晚的mfz师哥(并且还能不嫌弃我菜qwq超级感谢)(因为师哥讲的很细所以奇迹般地我现在还记得再次感谢)。
第三行感谢认真讲图的csb师哥。

图的存储方法+遍历——

1.邻接矩阵(二维数组)
储存

memset(n, 0, sizeof(n));
for(int i = 0; i < n; ++i)//n是边的个数
    {
	cin>>a>>b>>c;//a表示起始点b表示指向点c表示权值
	edge[a][b] = c;
    }

遍历同上循环即可。

2.邻接表(vector)
储存

struct tu
   {
	int v,len;//v是指向点,len是权值
   }

vector<tu>edge[maxn];

for(int i = 0; i < maxn; ++i)
    {
	edge[i].clear();//初始化vector
    }

for(int i = 0; i < n; ++i)//n为边数
    {
    	cin>>a>>b>>c;//输入起始点指向点权值
    	tu ed;//存最新的边
    	ed.v = b;
    	ed.len = c;
    	edge[a].push_back(ed);
    }

遍历

for(int i = 0; i <= maxn; ++i)//maxn为最大起始点
     {
     	int s = edge[i].size();//据c师哥说放在循环里会有耗时
     	for(int j = 0; j < s; ++j)
     	     {
     	     	tu edg =  edge[i][j];
     	     	int v1 = edg.v, len1 = edg.len;
     	     }

3.链式前向星
存储

struct tu
{
	int u,v,len,next;
}edge[maxn];

int cnt = 0, head[maxn];//需初始化head为-1,表示没有边

void add(int u, int v, int len)
{
	edge[cnt].u = u;//起始点
	edge[cnt].v = v;//指向点
	edge[cnt].len = len;//权值
	edge[cnt].next = head[u];//上一条起始点相同的边
	head[u] = cnt++;//下一条边
}

遍历

for(int i = head[u]; i != -1; i = edge[i].next)//遍历所有起点为u的边
    {
    	int v = edge[i].v;
    	int len = egde[i].len;
    	//进行操作
    }

请忽略我忘了在函数里写循环……
明白意思就好qwq

欢迎指出错误。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值