http://poj.org/problem?id=1511

 

题意:现有一些ACMERS需要坐车从1号站分别抵达2,3,....N(N<=1000000000)号站,等到晚上后,他们再各自从各自所在的位置返回到1号站。从 i -  j 站的价钱是不等的, 问你他们所需的最小花费是多少?

分析:由于给出的点太多了,只能用 spfa  算法了。。

 

 

 

 

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<queue>
#include<algorithm>
using namespace std;
typedef  long long LL;

#define maxn 1000010
#define oo 0x3f3f3f3f
int head[maxn], v[maxn], num[maxn], dist[maxn], a[maxn], b[maxn], c[maxn];
int n, cnt;
LL sum;
struct node
{
    int u, v, next, w;
}maps[maxn];

void Add(int u, int v, int w)
{
    maps[cnt].v = v;
    maps[cnt].w = w;
    maps[cnt].next = head[u];
    head[u] = cnt++;
}


void Init()
{
     for(int i=1; i<=n; i++)
        dist[i] = oo;

        dist[1] = 0;

        memset(v, 0, sizeof(v));
        memset(num, 0, sizeof(num));
        memset(head, -1, sizeof(head));
        cnt = 0;
}

void spfa()
{
    queue<int>Q;
    Q.push(1);
    v[1]=1;
    num[1]++;

    while(Q.size())
    {
        int p=Q.front();
        Q.pop();
        v[p]=0;

      for(int i=head[p]; i!=-1; i=maps[i].next)
      {
          int q=maps[i].v;

          if(dist[q]>dist[p]+maps[i].w)
          {
              dist[q]=dist[p]+maps[i].w;
              if(!v[q])
              {
                  v[q]=1;
                  num[q]++;
                  Q.push(q);
                  if(num[q]>n)  return;
              }
          }
      }
    }

    for(int i=1; i<=n; i++)
        sum += dist[i];

        return ;
}



int main()
{
    int T, m;

    scanf("%d", &T);

    while(T --)
    {
        scanf("%d %d", &n, &m);

         Init();

        for(int i=1; i<=m; i++)
        {
            scanf("%d %d %d", &a[i], &b[i], &c[i]);

           Add(a[i], b[i], c[i]);
        }

        sum = 0;

        spfa();

        Init();

        for(int i=1; i<=m; i++)
        {
           Add(b[i], a[i], c[i]);
        }


       spfa();

        printf("%I64d\n", sum);
    }

    return 0;
}
View Code

 

posted on 2016-07-25 09:24  不忧尘世不忧心  阅读(106)  评论(0编辑  收藏  举报