ACM-最短路径邻接表

在求最短路径的时候为了节约内存的消耗我们引用了邻接表的存储方式来节约内存的消耗,邻接表就是相当于链表的思想
思想就是这样
代码:

#include<cstdlib>//邻接表
#include<cstring>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;
int e;
const int maxn = 10000;
int to[maxn],from[maxn],next[maxn],head[maxn],cost[maxn];
int Add(int u, int v, int w)
{
    to[e] = v;//存的是到达的数
    from[e] = u;//存的是开始的数
    next[e] = head[u];//next数组存的是上一个头的下标,如果上一个没有头存的是-1
    head[u] = e++;//e是一个下标
    cost[e] = w;//存的是权值
}
void Output()
{
   for(int i =1; i <= n; i++)
   {
       if(head[i] == -1)
       {
           continue;
       }
       for(int j = head[i];j > -1; j=next[j])
       {
           printf("%d-->%d\n",from[j],to[j]);
       }
   }
}
int main()
{
    while(scanf("%d%d", &n,&m) != EOF)//有n个起点,1到n,m条边
    {
        e = 0;
        memset(head,-1,sizeof(head));//必须初始化为-1,因为当next数组为-1时就表明这个没有指向的数了
        for(int i = 1; i <= m; i++)
        {
            int u, v, w;
            scanf("%d%d%d", &u,&v,&w);
            Add(u,v,w);//构建的是无向图
            Add(v,u,w);
        }
        Output();//输出邻接表
    }
    return 0;
}

新手,写给自己看的!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值