zoukankan      html  css  js  c++  java
  • kuangbin_ShortPath J (POJ 1511)

    其实虽然一开始有被这个题的8000MS 和 256MB限制又被吓到 但是严格来说跟之前的POJ 3268是一样的做法只是数据大了点

    但是问题就出在数据大了点上 其实严格来说也不大 1e6 数组加起来大概1e7 然后RE了

    C Free上死活测不出问题了之后想到用VS来debug然后发现爆栈 然后一块块注释 最后查出原因是数组开在了函数内

    但是为什么开在外面就可以了呢 然后我又去问了学长们 然后去看了这个文章 C语言中内存分配

    真是一场血案............. 不过学到了很多 栈 堆 全局静态变量区 代码区 数据区 五个区的关系 虽然只是粗浅了解但是还是收益很大

    然后明白了C Primer Plus 确实是入门书啊.......连malloc 和alloc的区别都没说 而且也没说到malloc原来可以独享一个区的空间....

    以及VS用来debug RE问题真丝好用 C Free上总是莫名其妙得完美运行啊摔

    以后有空必须看看龙书了=.=

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <queue>
    #include <map>
    #include <vector>
    #include <set>
    #include <algorithm>
    #define INF 0x3F3F3F3F
    using namespace std;
    
    const int MAXN = 1e6 + 10;
    const int MAXM = 1e6 + 10;
    
    typedef pair<int, int> pii;
    struct cmp{
        bool operator () (const pii a, const pii b){
            return a.first > b.first;
        }
    };
    
    int size, head[MAXN], val[MAXM], point[MAXM], next[MAXM];
    int t, n, m, dis[MAXN];
    int a[MAXM], b[MAXM], value[MAXM];
    
    void init()
    {
        size = 0;
        memset(head, -1, sizeof head); 
    }
    
    inline void add(int from, int to, int value)
    {
        val[size] = value;
        point[size] = to;
        next[size] = head[from];
        head[from] = size++;
    }
    
    long long dij(int s)
    {
        memset(dis, 0x3f, sizeof dis);
        
        priority_queue<pii, vector<pii>, cmp> q;
        dis[s] = 0;
        q.push(make_pair(0, s));
        while(!q.empty()){
            pii u = q.top();
            q.pop();
            if(u.first > dis[u.second]) continue;
            for(int i = head[u.second]; ~i; i = next[i]){
                int j = point[i];
                if(dis[j] > dis[u.second] + val[i]){
                    dis[j] = dis[u.second] + val[i];
                    q.push(make_pair(dis[j], j));
                }
            }
        }
        
        long long sum = 0;
        for(int i = 1; i <= n; i++){
            sum += dis[i];
        }
        return sum;
    }
    
    int main()
    {
        scanf("%d", &t);
        while(t--){
            long long ans;
            
            scanf("%d%d", &n, &m);
            init();
            for(int i = 1; i <= m; i++){
                scanf("%d%d%d", &a[i], &b[i], &value[i]);
                add(a[i], b[i], value[i]);
            }
            ans = dij(1);
            init();
            for(int i = 1; i <= m; i++){
                add(b[i], a[i], value[i]);
            }
            ans += dij(1);
            printf("%I64d
    ", ans);
        }    
        return 0;
    }
  • 相关阅读:
    森田疗法
    “不支持一个STA线程上针对多个句柄的WaitAll。”的解决方案
    烽火HG226信息
    祝贺小牛队得NBA总冠军
    .net4调用非托管代码出现:PInvoke调用导致堆栈不对称
    大怪路子逻辑
    C#内存复制与比较
    【收藏】UDP广播和多播
    Objectivec NSString
    Objectivec NSDictionary(NSMutableDictionary)
  • 原文地址:https://www.cnblogs.com/quasar/p/5084050.html
Copyright © 2011-2022 走看看