您的位置:首页 > 其它

贴个模板,POJ 1511

2015-07-28 00:00 239 查看
N个点M条边,有向图,求1到其余各点的最短距离与各点到1的距离最短的路径总和。

N M 1E6

朴素必跪。。。

Dijkstra堆优化和SPFA应该都能过。

因为是有向图,求1到各点的距离,直接原图上跑SPFA。。

求各点回到1的距离,将边反转(from变to ,to 变from),在新图上再跑一遍SPFA。

8S的题,7S卡过,真尼玛2333333。。单纯的贴个SPFA的模板,以后说不定有用-- 。。

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;

const int   maxn=1000055;
const long long    inf=1000000005;
bool Inq[maxn];
long long   dis[maxn];

int A[maxn],B[maxn],C[maxn];
int   n,m;
struct edge{
    int   to;
   long long    w;
};
vector<edge> G[maxn];
void spfa(int   src)
{
    for(int   i=0;i<maxn;i++)
    {
        dis[i]=inf;
    }
    dis[src]=0;
    memset(Inq,0,sizeof(Inq));
    queue<int > q;
    Inq[src]=1;
    q.push(src);
    while(!q.empty())
    {
        int   cur=q.front();
        q.pop();
        Inq[cur]=0;
        for(int   i=0;i<G[cur].size();i++)
        {
            edge& E=G[cur][i];
            if(dis[E.to]>dis[cur]+E.w)
            {
                dis[E.to]=dis[cur]+E.w;
                if(Inq[E.to]==0)
                {
                    q.push(E.to);
                    Inq[E.to]=1;
                }
            }
        }
    }
}

int main()
{

  ios_base::sync_with_stdio(false);
    int  t;
    scanf("%d",&t);
    while(t--)
    {
       scanf("%d%d",&n,&m);
    for(int   i=0;i<=maxn;i++)
    {
        G[i].clear();

    }
    for(int  i=0;i<m;i++)
    {

        scanf("%I64d%I64d%I64d",&A[i],&B[i],&C[i]);
        G[A[i]].push_back((edge) {B[i],C[i]});
         //G1[to].push_back((edge) {from,w});

    }
    spfa(1);
     long long  ans=0;

    for(int   i=2;i<=n;i++)
        {
            ans+=dis[i];
        }
    for(int   i=0;i<=maxn;i++)
    {
        G[i].clear();

    }
     for(int  i=0;i<m;i++)
    {

      //  scanf("%I64d%I64d%I64d",&A[i],&B[i],&C[i]);
        G[B[i]].push_back((edge) {A[i],C[i]});
         //G1[to].push_back((edge) {from,w});

    }

    spfa(1);
       for(int   i=2;i<=n;i++)
        {
            ans+=dis[i];
        }

       printf("%I64d\n",ans);
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: