• bzoj 2364


    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2346

    比较裸的最短路(' '     ) 水题又多了一道

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <queue>
    using namespace std;
    
    const int maxn = 400010;
    const int maxe = 2001000;
    const int maxl = 510;
    const int INF = 0x3f3f3f3f;
    
    struct edge {
        int t, d;
        edge* next;
    }e[maxe * 2], *head[maxn]; int ne = 0;
    
    void addedge(int f, int t, int d) {
        e[ne].t = t, e[ne].d = d, e[ne].next = head[f], head[f] = e + ne ++;
        e[ne].t = f, e[ne].d = d, e[ne].next = head[t], head[t] = e + ne ++;
    }
    
    struct node {
        int pos, dis; 
        node(int a, int b) {
            pos = a, dis = b;
        }
    };
    
    bool operator < (const node &a, const node &b) {
        return a.dis > b.dis;
    }
    
    priority_queue <node> q; 
    int dis[maxn];
    
    void dijkstra(int s, int t) {
        memset(dis, INF, sizeof(dis)); dis[s] = 0;
        for(int i = s; i <= t; ++ i) q.push(node(i, dis[i]));
        while(!q.empty()) {
            node x = q.top(); q.pop();
            if(x.dis != dis[x.pos]) continue;
            for(edge* p = head[x.pos]; p; p = p-> next) 
                if(dis[p-> t] > dis[x.pos] + p-> d)
                    dis[p-> t] = dis[x.pos] + p-> d, q.push(node(p-> t, dis[p-> t]));
        }
    }
    
    int n, m;
    
    int getpos(int x, int t) {
        return (x - 1) * (m + 1) + t;
    }
    
    char s[maxl];
    
    void sov() {
        scanf("%d%d", &n, &m);
        for(int i = 1; i <= n; ++ i) {
            scanf("%s", s + 1);
            for(int j = 1; j <= m; ++ j) {
                if(s[j] == '/') addedge(getpos(i, j), getpos(i + 1, j + 1), 1), addedge(getpos(i + 1, j), getpos(i, j + 1), 0);
                else addedge(getpos(i, j), getpos(i + 1, j + 1), 0), addedge(getpos(i + 1, j), getpos(i, j + 1), 1);
            }
        }
        dijkstra(getpos(1, 1), getpos(n + 1, m + 1)); 
        if(dis[getpos(n + 1, m + 1)] == INF) printf("NO SOLUTION
    ");
        else printf("%d
    ", dis[getpos(n + 1, m + 1)]);
    }
    
    int main() {
        //freopen("test.in", "r", stdin);
        //freopen("test.out", "w", stdout);
        sov();
        return 0;
    }
    
  • 相关阅读:
    sqlserver查询表字段
    Lombok
    属性配置
    计时器与启动加载器
    banner
    互斥锁和条件变量
    System V消息队列
    命令行参数的处理函数getopt
    posix 消息队列
    不定参数
  • 原文地址:https://www.cnblogs.com/ianaesthetic/p/4251737.html
Copyright © 2020-2023  润新知