• 拓展朴素 dijkstra 7-13 天梯地图 (30分)


    https://pintia.cn/problem-sets/1218775317992300544/problems/1218775886605705228

    #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<string>
    #include<map>
    #include<set>
    #include<cstring>
    using namespace std;
    #define STDIN freopen("in.in", "r", stdin);freopen("out.out", "w", stdout);
    int g[1000][1000];
    int time1[1000][1000];
    int len[1000][1000];
    int distime[1000];
    int dislen[1000];
    bool bst[1000];
    int n,m;
    int pre1[1000];
    int pre2[1000];
    int st, ed;
    vector<int> vec1;
    vector<int> vec2;
    int step1[1000];
    int step2[1000];
    int dijkstra1(int st, int ed)
    {
        dislen[st] = 0;
    //    bst[st] =true;
        step2[st] = 1;
        memset(bst,0,sizeof bst);
        for (int i = 0; i < n-1; i++)
        {
            int t = -1;
            for (int j= 1; j <= n; j++)
            {
                if (!bst[j] && (t == -1 || dislen[j] < dislen[t] )) t = j;
            }
            for (int j = 0; j< n; j++)
            {
                if (dislen[t] + len[t][j] < dislen[j]){
                    dislen[j] = min(dislen[j], dislen[t] + len[t][j]);
                    pre2[j] = t;
                    step2[j] = step2[t]+1;
                }
                if (dislen[t] + len[t][j] == dislen[j]){
                    if (step2[j] > step2[t] + 1)
                    {
                        pre2[j] = t;
                        step2[j] = step2[t] + 1;
                    }
                }
                
            }
            bst[t] = true;
        }
        if (dislen[ed] == 0x3f3f3f3f) return -1;
        return dislen[ed];
    }
    int dijkstra2(int st, int ed)
    {
        memset(dislen, 0x3f, sizeof dislen);
        distime[st] = 0;
        dislen[st] = 0;
    
        memset(bst,0,sizeof bst);
        for (int i = 0; i < n-1; i++)
        {
            int t = -1;
            for (int j= 1; j <= n; j++)
            {
                if (!bst[j] && (t == -1 || distime[j] < distime[t] )) t = j;
            }
            for (int j = 0; j< n; j++)
            {
                if (distime[t] + time1[t][j] < distime[j]){
                    distime[j] = min(distime[j], distime[t] + time1[t][j]);
                    pre1[j] = t;
                    dislen[j] = dislen[t] + len[t][j];
                    
    //                step1[j] = step1[t] + 1;
                }
                if (distime[t] + time1[t][j] == distime[j])
                {
                    if (dislen[j] > dislen[t] + len[t][j])
                    {
                        pre1[j] = t;
                        dislen[j] = dislen[t] + len[t][j];
                    }
                }
            }
            bst[t] = true;
        }
        if (distime[ed] == 0x3f3f3f3f) return -1;
        return distime[ed];
    }
    void print1(int x)
    {
        if (x != -1) {
            print1(pre1[x]);
    //        cout << x;
            vec1.push_back(x);
        }
    //    if (x == ed) cout << endl;
    }
    void print2(int x)
    {
        if (x != -1) {
            print2(pre2[x]);
    //        cout << x;
            vec2.push_back(x);
        }
    //    if (x == ed) cout << endl;
    }
    bool f(vector<int> & a, vector<int> &b)
    {
        int len = a.size();
        for (int i = 0; i < len; i++)
        {
            if (a[i] != b[i]) return false;
        }
        return true;
    }
    int main()
    {
    //    int n, m;
    //     STDIN
        cin >> n >> m;
        memset(len, 0x3f,sizeof len);
        memset(time1, 0x3f, sizeof time1);
        memset(pre1, -1, sizeof pre1);
        memset(pre2, -1, sizeof pre2);
        memset(step1, 0x3f, sizeof step1);
        memset(step2, 0x3f, sizeof step2);
        memset(dislen, 0x3f, sizeof dislen);memset(distime, 0x3f, sizeof distime);
        for (int i = 1; i <= m; i++)
        {
            int a, b, c, d, e;
            cin >> a >> b >> c >> d >> e;
            len[a][b] = min(d, len[a][b]);
            time1[a][b] = min(e, time1[a][b]);
            if (c == 0){
                len[b][a] = min(d, len[b][a]);
                time1[b][a] = min(e, time1[b][a]);
            }
             
        }
    
        cin >> st >> ed;
        
        int ans2 = dijkstra1(st, ed);
        int ans1 = dijkstra2(st, ed);
        print1(ed);
        print2(ed);
        if (f(vec1,vec2))
        {
            printf("Time = %d; Distance = %d: ", ans1, ans2);
            int len = vec1.size();
            for (int i = 0; i < len; i++)
            {
                cout<< vec1[i];
                if (i == len-1) cout << endl;
                else cout << " => ";
            }
        }
        else{
            printf("Time = %d: ",ans1);
            int len1 = vec1.size();
            for (int i = 0; i < len1; i++)
            {
                cout<< vec1[i];
                if (i == len1-1) cout << endl;
                else cout << " => ";
            }
            printf("Distance = %d: ",ans2);
            int len2 = vec2.size();
            for (int i = 0; i < len2; i++)
            {
                cout<< vec2[i];
                if (i == len2-1) cout << endl;
                else cout << " => ";
            }
        }
    } 
  • 相关阅读:
    石头汤
    win8激活 DNS名称不存在
    IE系列hack
    CSS缩写
    MSDN资源
    项目管理之软件文档知多少
    jqModal
    Microsoft Security Essentials 不升级方法
    XP没有声音服务解决方案
    office2003安全模式启动,默认模板问题/打开word就显示“无法装载这个对象”
  • 原文地址:https://www.cnblogs.com/hulian425/p/14029291.html
Copyright © 2020-2023  润新知