• Age of Moyu HDU


    给出n和点,m条边,每条边有各自的标号,进入第一个标号需要消耗1的费用,此后转换标号需要1费用,在同一个标号上走不需要费用。问你从1到n最少需要多少费用。

    最短路变形,把第一个点看成不存在的标号,然后从第一个点开始走,然后就是dijkstra了...当时没好好学dij的优化,当场的时候没加堆优化,乱T....

    #include<map>
    #include<set>
    #include<ctime>
    #include<cmath>
    #include<stack>
    #include<queue>
    #include<string>
    #include<vector>
    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define lowbit(x) (x & (-x))
    
    typedef unsigned long long int ull;
    typedef long long int ll;
    const double pi = 4.0*atan(1.0);
    const int inf = 0x3f3f3f3f;
    const int maxn = 200010;
    const int maxm = 400010;
    const int mod = 998244353;
    using namespace std;
    
    int n, m;
    int T, tol;
    struct Node {
        int v, f, w;
        int next;
        bool operator < (Node a) const {
            return w > a.w;
        }
    };
    Node node[maxm];
    int head[maxn];
    bool vis[maxn];
    int dis[maxn];
    
    void init() {
        tol = 0;
        memset(vis, 0, sizeof vis);
        memset(dis, inf, sizeof dis);
        memset(head, -1, sizeof head);
    }
    
    void addnode(int u, int v, int f) {
        node[tol].v = v;
        node[tol].f = f;
        node[tol].next = head[u];
        head[u] = tol++;
    }
    
    void dijkstra() {
        dis[1] = 0;
        priority_queue<Node > q;
        while(!q.empty()) q.pop();
        Node now;
        now.v = 1;
        now.f = 0;
        now.w = 0;
        q.push(now);
        while(!q.empty()) {
            now = q.top();
            q.pop();
            int u = now.v;
            if(vis[u])    continue;
            vis[u] = true;
            dis[u] = now.w;
            for(int i=head[u]; ~i; i=node[i].next) {
                int v = node[i].v;
                if(!vis[v]) {
                    Node nex;
                    nex.v = v;
                    nex.f = node[i].f;
                    nex.w = dis[u] + (node[i].f != now.f);
                    q.push(nex);
                }
            }
        }
    }
    
    int main() {
        while(~scanf("%d%d", &n, &m)) {
            init();
            int u, v, w;
            for(int i=1; i<=m; i++) {
                scanf("%d%d%d", &u, &v, &w);
                addnode(u, v, w);
                addnode(v, u, w);
            }
            dijkstra();
            if(dis[n] == inf)    printf("-1
    ");
            else    printf("%d
    ", dis[n]);
        }
        return 0;
    }
    View Code
  • 相关阅读:
    Vue3.0官方文档
    简单实现Vue的双向绑定原理
    小程序使用weapp-qrcode二维码插件,宽高自适应解决方法
    小程序判断ios还是android
    手写实现bind
    手写实现call,apply函数
    React onClick点击事件传参三种写法
    zynq 中断
    zynq_ps端点亮led灯代码
    突然发现自己的很多博客无法显示图片,人都傻了,于是就整理了一早上,全部换成了markdown格式,就好了,希望博客的时间不会对大家造成困扰!!!
  • 原文地址:https://www.cnblogs.com/Jiaaaaaaaqi/p/9492240.html
Copyright © 2020-2023  润新知