• kuangbin_ShortPath M (POJ 1062)


    提出了一个错误的算法 以为能优化到只运行两次dij

    然而我还是too naive 还是乖乖dij n 次吧...

    #include <iostream>
    #include <string>
    #include <cstdio>
    #include <cmath>
    #include <cstring>
    #include <queue>
    #include <vector>
    #include <set>
    #include <algorithm>
    #define INF 0x3F3F3F3F
    using namespace std;
    
    typedef pair<int, int> pii;
    struct cmp{
        bool operator () (const pii a, const pii b){
            return a.first > b.first;
        }
    };
    
    int map[110][110], val[110][110], lev[110];
    int m, n;
    
    int dij()
    {
        int  dist[110];
        priority_queue<pii, vector<pii>, cmp> q;
        memset(dist, 0x3f, sizeof dist);
        dist[0] = 0;
        q.push(make_pair(0, 0));
        while(!q.empty()){
            pii u = q.top();
            q.pop();
            if(u.first > dist[u.second]) continue;
            for(int i = 1; i <= n; i++){
                if(dist[i] > dist[u.second] + val[u.second][i]){
                    dist[i] = dist[u.second] + val[u.second][i];
                    q.push(make_pair(dist[i], i));
                }
            }
        }
        return dist[1];
    }
    
    int main()
    {
        memset(map, 0x3f, sizeof val);
        scanf("%d%d", &m, &n);
        for(int i = 1; i <= n; i++){
            int x, y, p;
            scanf("%d%d%d", &map[0][i], &lev[i], &x);
            while(x--){
                scanf("%d%d", &y, &p);
                map[y][i] = p;
            }
        }
        int ans = INF;
        for(int i = 0; i <= m; i++){
            memset(val, 0x3f, sizeof val);
            for(int x = 0 ; x <= n; x++){
                if(x == 0 || (lev[x] >= lev[1] - m + i && lev[x] <= lev[1] + i)){
                    for(int y = 1; y <= n; y++){
                        if(lev[y] >= lev[1] - m + i && lev[y] <= lev[1] + i){
                            val[x][y] = map[x][y];
                        }
                    }
                }
            }
            ans = min(dij(), ans);
            //printf("%d ~ %d : %d
    ", lev[1] - m + i, lev[1] + i, ans);
        }
        printf("%d
    ", ans);
        return 0;
    }
  • 相关阅读:
    Ubuntu搭建FTP服务器
    【wireshark】wireshark 出现There are no interfaces on which a capture can be done.的解决方法
    那些强悍的PHP一句话后门
    Ubuntu下SSH设置
    Servlet&JSP中的知识点
    String s=new String("abc")创建了几个对象?
    JavaEE的13种核心技术
    ++i和i++
    构造方法
    TCP/IP
  • 原文地址:https://www.cnblogs.com/quasar/p/5127836.html
Copyright © 2020-2023  润新知