比赛 平凡的题目 评测结果 ATTTA
题目名称 平凡的皮卡丘 最终得分 40
用户昵称 璞瑞 运行时间 3.015 s
代码语言 C++ 内存使用 7.97 MiB
提交时间 2015-11-03 11:12:37
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
typedef long long int i64;
template<class T> inline bool mint(T& a, T b) { return a > b ? a = b, true : false; }
template<class T> inline bool maxt(T& a, T b) { return a < b ? a = b, true : false; }

const int maxn = 100333;

#ifdef WINVER
#define QAQ "%I64d"
#else
#define QAQ "%lld"
#endif

struct ed
{
    int v, w; ed * nx; ed() {}
    ed(int _v, int _w, ed * _nx)
        : v(_v), w(_w), nx(_nx) {}

} *G[maxn], mem[maxn << 2], *all = mem;

int n, m, vis[maxn << 2];
struct dij
{
    i64 dis; int o;
    inline bool operator<(const dij& other)
        const { return dis > other.dis; }
}; priority_queue<dij> Q;
i64 dist[maxn];
inline i64 mindist(int s, int fbd)
{
    static int vvv[maxn]; int cnt = 0;
    Q.push((dij) { dist[s] = 0, s });
    
    while (Q.size())
    {
        int o = Q.top().o; Q.pop();
        if (vis[o]) continue; 
        vis[vvv[cnt++] = o] = true;
        for (ed *p = G[o]; p; p = p->nx) if ((p - mem) >>1 != fbd)
            if (!vis[p->v] && mint(dist[p->v], dist[o] + p->w))
                    Q.push((dij) { dist[p->v], p->v });
    }
    i64 ret = dist[1];
    while (cnt --> 0)
    {
        dist[vvv[cnt]] = 0x3f3f3f3f3f3f3f3fLL;
        vis[vvv[cnt]] = 0;
    } return ret;
}
int main()
{
    freopen("both.in", "r", stdin);
#ifndef debug
    freopen("both.out", "w", stdout);
#endif
    scanf("%d%d", &n, &m);
    for (int i = 0; i < m; ++i)
    {
        int u, v, x, y; scanf("%d%d%d%d", &u, &v, &x, &y);
        G[u] = new(all++) ed(v, x, G[u]);
        G[v] = new(all++) ed(u, y, G[v]);
    }
    memset(dist, 0x3f, sizeof(dist));
    i64 ans = 0x3f3f3f3f3f3f3f3fLL;
    for (ed *p = G[1]; p; p = p->nx)
        mint(ans, mindist(p->v, (p - mem) >> 1) + p->w);
    if (ans == 0x3f3f3f3f3f3f3f3fLL) puts("-1");
    else printf(QAQ"\n", ans);

}