zoukankan      html  css  js  c++  java
  • Invitation Cards POJ 1511

    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
    ", sum);
        }
    
        return 0;
    }
    View Code
  • 相关阅读:
    C++---const
    qt--textEdit多行文本编辑框
    qt--QByteArray字节数组
    qt5--拖放
    qt5--自定义事件与事件的发送
    qt5--键盘事件
    qt5--鼠标事件
    qt5-事件过滤器
    qt5-event事件的传递
    qt-事件的接受和忽略
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5702355.html
Copyright © 2011-2022 走看看