BZOJ1975【左偏树】

来源:互联网 发布:微信一键转发软件苹果 编辑:程序博客网 时间:2024/06/05 03:17

卡Priority_queue的内存简直是不忍直视.

/* I will wait for you */ #include <cstdio>#include <cstdlib>#include <cstring>#include <cmath>#include <ctime>#include <algorithm>#include <iostream>#include <fstream>#include <vector>#include <queue>#include <deque>#include <set>#include <map>#include <string>#define make make_pair#define fi first#define se second using namespace std; typedef long long ll;typedef unsigned long long ull;typedef pair<int, int> pii;typedef map<int, int> mii; const int maxn = 200010;const int maxm = 1010;const int maxs = 26;const int inf = 0x3f3f3f3f;const int P = 1000000007;const double eps = 1e-6; inline ll read(){    ll x = 0, f = 1; char ch = getchar();    while (ch < '0' || ch > '9')          f = (ch == '-' ? -1 : 1), ch = getchar();    while (ch >= '0' && ch <= '9')          x = x * 10 + ch - '0', ch = getchar();    return x * f;} typedef pair<double, pair<int, double> > Pii; struct Heap{    Pii val; int dis, size; Heap *ls, *rs;} *null; void init(){    null = new Heap();    null -> val = make(1e12, make(0, 1e12));    null -> dis = -1, null -> size = 0;    null -> ls = null -> rs = null;} Heap *marge(Heap *a, Heap *b){    if (a == null) return b;    if (b == null) return a;         if (a -> val > b -> val) swap(a, b);    a -> rs = marge(a -> rs, b);         if (a -> ls -> dis < a -> rs -> dis)        swap(a -> ls, a -> rs);    a -> dis = a -> ls -> dis + 1;    a -> size = a -> ls -> size + a -> rs -> size;    return a;} struct _Heap{    Heap *Q;    void init() {        Q = null;    }    bool empty() {        return Q -> size == 0;    }    Pii top() {        return Q -> val;    }    void pop() {        Heap* _del = Q;         Q = marge(Q -> ls, Q -> rs), delete(_del);    }    void push(Pii a) {        Heap *_Q = new Heap();        _Q -> val = a, _Q -> dis = 0, _Q -> size = 1;        _Q -> ls = _Q -> rs = null, Q = marge(Q, _Q);    }} q; struct edge{    int v; double w; int next;} e[maxn], _e[maxn]; int n, m, cnt, _cnt, ans = -1, head[maxn], _head[maxn], vis[maxn];double E, h[maxn]; void insert(int u, int v, double w){    e[cnt] = (edge) {v, w, head[u]}, head[u] = cnt++;} void _insert(int u, int v, double w){    _e[_cnt] = (edge) {v, w, _head[u]}, _head[u] = _cnt++;} void spfa(){    for (int i = 1; i <= n; i++)        h[i] = i == n ? 0 : 1e12;    queue<int> _q; _q.push(n);             while (!_q.empty()) {        int u = _q.front();        _q.pop(), vis[u] = 0;                 for (int i = _head[u]; ~i; i = _e[i].next) {            int v = _e[i].v;            if (h[v] > h[u] + _e[i].w) {                h[v] = h[u] + _e[i].w;                if (!vis[v]) vis[v] = 1, _q.push(v);            }        }    }}  void Astar(){    q.init(), q.push(make(h[1], make(1, 0)));         while (!q.empty() && E >= -eps) {        Pii sta = q.top(); q.pop();                 int u = sta.se.fi; double w = sta.se.se;        if (u == n) ans += 1, E -= w;                 for (int i = head[u]; ~i; i = e[i].next) {            int v = e[i].v; double _w = w + e[i].w;            q.push(make(_w + h[v], make(v, _w)));        }    }} int main(){    scanf("%d%d%lf", &n, &m, &E);         memset(head, -1, sizeof head);    memset(_head, -1, sizeof _head);    for (int i = 1; i <= m; i++) {        int u, v; double w;         scanf("%d%d%lf", &u, &v, &w);        insert(u, v, w), _insert(v, u, w);    }         init(), spfa(), Astar();    printf("%d\n", ans);         return 0;}


0 0