poj1511(第一次用数组模拟邻接表…

本文介绍了一种使用SPFA算法求解从源点到所有其他点来回的最短路径的方法。考虑到数据规模较大,采用了数组模拟邻接表,并且强调了使用longlong类型变量的重要性。
题意:求出所有点到源点来回的最短距离 。

解法:先求出源点到其他所有点的最短距离 , 再把所有边反向 , 再求源点到所有点的距离 。

由于这题的数据量太大 , 所以只能用数组来模拟邻接表 , 如果用vector会超内存 。

还要注意一点 , 一定要用long long
代码:
#include
#include
#include
#include
#include
using namespace std;

#define MAXN  1000010
#define INF  0xFFFFFFFF
struct edge
{
    int  to , d , next;
}edges1[2][MAXN];
long long d1[MAXN] , first[2][MAXN];
long long  n , m , sum = 0 , vis[MAXN] ;

void spfa(int s)
{
    int i , x;
    queueq;
    for(i = 1; i <= n; i++)  d1[i] = INF;
    d1[1] = 0;
    memset(vis , 0 , sizeof(vis));
    q.push(1);
    vis[1] = 1;
    edge e;
    while(!q.empty())
    {
        int u = q.front(); q.pop();
        vis[u] = 0;
        x = first[s][u];
        if(x == -1)  continue ;
        while(x != -1)
        {
            e = edges1[s][x];
            if(d1[e.to] > d1[u] + e.d)
            {
                d1[e.to] = d1[u] + e.d ;
                if(!vis[e.to])  {vis[e.to] = 1; q.push(e.to);}
            }
            x = edges1[s][x].next ;
        }
    }
    for(i = 1; i <= n; i++)
        sum += d1[i];
}

int main()
{
   // cout<<INF<<endl;
    int t;
    cin>>t;
    while(t--)
    {
        scanf("%lld %lld" , &n , &m);
        int i , x , y , z;
        for(i = 0; i <= n; i++)
            first[0][i] = first[1][i] = -1;
        for(i = 0 ; i < m; i++)
        {
            scanf("%d %d %d" , &x , &y , &z);
            edges1[0][i].to = y , edges1[0][i].d = z;
            edges1[0][i].next = first[0][x] ;
            first[0][x] = i;

            edges1[1][i].to = x; edges1[1][i].d= z;
            edges1[1][i].next = first[1][y];
            first[1][y] = i;
            //cout<<i<<endl;
        }
        sum = 0;
        spfa(0);
        spfa(1);
        printf("%lld\n" , sum);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值